当前位置: 首页 > news >正文

【LeetCode】四数之和 - 指南

文章目录

  • 前言
  • 题目描述
  • 算法原理
  • 代码实现


前言

道友们,今天咱们来做四数之和!


题目链接:18.四数之和

题目描述

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组[nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • a、b、c 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

示例 1:

输入: nums = [1,0,-1,0,-2,2], target = 0
输出: [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入: nums = [2,2,2,2,2], target = 8
输出: [[2,2,2,2]]

提示:

1 <= nums.length <= 200
-10^9 <= nums[i] <= 10^9
-10^9 <= target <=10^9

算法原理

这道题跟我们做的上一道题很类似,只不过要更复杂一点,但是做法是相同的。
首先我们对数组排序,方便我们后续去重和使用双指针算法,以示例 1 为例:

在这里插入图片描述

排完序之后,固定最左边的元素,在它的右区间找三个数,使这三个数的和与我们固定的数再相加结果为 target,我们可以看到,在右区间找三个数的过程就是我们上次做的那道三数之和的问题,如果没看过的道友可以去看一下。

这里去重操作我们依然有两种写法,即用 set 去重、自己手动去重,这道题的代码逻辑和三数之和几乎一模一样,包括在越界等细节方面的处理,如果三数之和那道题会做了,那这道题是很简单的。

总体上,四数之和这道题就是在三数之和的基础上多套了一层!

代码实现

用set去重

class Solution
{
public:
vector<vector<int>> fourSum(vector<int>& nums, int target){int n = nums.size();sort(nums.begin(), nums.end());set<vector<int>> s;for (int i = 0; i < n - 3; ++i){for (int j = i + 1; j < n - 2; ++j){long long int tag = (long long)target - nums[i] - nums[j];int left = j + 1, right = n - 1;while (left < right){if (nums[left] + nums[right] < tag){left++;}else if(nums[left] + nums[right] > tag){right--;}else{s.insert({nums[i], nums[j], nums[left], nums[right]});left++;right--;}}}}vector<vector<int>> v;for (auto& e : s){v.push_back(e);}return v;}};

自己手动去重

class Solution
{
public:
vector<vector<int>> fourSum(vector<int>& nums, int target){int n = nums.size();sort(nums.begin(), nums.end());vector<vector<int>> v;for (int i = 0; i < n - 3;){for (int j = i + 1; j < n - 2;){long long int tag = (long long int)target - nums[i] - nums[j];int left = j + 1, right = n - 1;while (left < right){if (nums[left] + nums[right] < tag){left++;}else if(nums[left] + nums[right] > tag){right--;}else{v.push_back({nums[i], nums[j], nums[left], nums[right]});left++;right--;while(left < right && nums[left] == nums[left - 1]) left++;while(left < right && nums[right] == nums[right + 1]) right--;}}++j;while(j < n - 2 && nums[j] == nums[j - 1]) ++j;}++i;while(i < n - 3 && nums[i] == nums[i - 1]) ++i;}return v;}};

这里有一个要注意的点,我们在一个区间找目标值的时候要先计算出我们要找的目标值,如果我们把目标值的类型定义为 int 的话,在一些用例中是会越界的,这里我们可以用 long long来存一下。

long long int tag = (long long int)target - nums[i] - nums[j];

要注意左边的变量也要强转一下,三个变量里面强转任意一个都行,因为剩下的两个会发生算数转换。


完!

http://www.jsqmd.com/news/299110/

相关文章:

  • 我在哪儿-- 照片定位查看助手
  • 2026年企业AI获客必看:GEO服务商选型权威指南
  • LoRA微调target module设置
  • Claude Skills 保姆级教程:无脑照做就能用出效果
  • 人工智能之核心技术 深度学习 第一章 神经网络基础
  • 慢充3.3kW占20%,普通7kW占50%,快充11kW占20%,超充20kW占10
  • 2026年青少年心理辅导优选名单,口碑机构来助力,家庭教育指导/叛逆孩子教育/青少年心理咨询,青少年心理辅导学校排名
  • 完整教程:目前流行的前端框架
  • 电力市场出清程序。 IEEE14节点考虑输电阻塞,求解机组边际电价和节点边际电价。 采用拉格朗...
  • 单北斗GNSS在桥梁和地质灾害变形监测中的应用与发展
  • 【LeetCode】91. 解码方法 - 教程
  • 2026 主流GEO服务商全景图谱,企业GEO服务商选型指南
  • 三相与两相步进方案的矢量控制及超前角控制:内置微控制器的技术解析
  • 光伏储能交直流微电网matlab/simulink仿真,风光储能联合发电系统simulink仿...
  • 双亲表示法构造树-----Java实现
  • KiCad V10新特性前瞻
  • 电气设计的隐藏外挂:1:1元器件图库实战
  • 基于传统材料力学势能法的健康齿轮时变啮合刚度数值分析
  • Product Hunt 每日热榜 | 2026-01-25
  • 构建 OpenHarmony 跨设备任务协同中心:Flutter 实现多端任务流转与状态同步
  • 构建 OpenHarmony 智能场景自动化配置面板:Flutter 实现可视化规则编排
  • Simulink双Y-30度六相感应电机模型,matlab18B版本。 六相交流供电
  • 强烈安利8个一键生成论文工具,继续教育学生论文写作必备!
  • ubuntu_server安装教程
  • 基于深度学习的 pcb 缺陷检测系统
  • 基于单片机的汽车倒车雷达超声波测距系统设计
  • 2025年市面上热门的自动化立体库制造企业怎么选,轻型货架/隔板货架/仓储货架/中型货架,自动化立体库供应厂家哪家强
  • JWT 解码工具
  • 基于深度学习的电动车头盔检测系统
  • keycloak测试11.0.2 for windows