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

力扣-18.四数之和

18. 四数之和

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

  • 0 <= a, b, c, d < n
  • abcd互不相同
  • 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]]

四数之和与15. 三数之和解法类似,只是由一重循环变成了双重循环,剪枝和去重都多了一次。

一、三数之和求三数相加为0。解法:

对数组排序,然后固定第 i 个数,剪枝操作即当 第 i 个数指向都大于0了,那后面的无需再加一定大于0(数组已经由小到大排列好了),去重操作即当重复要跳过。但这里有一个问题,是判断 nums[i] 与 nums[i + 1]是否相同,还是判断 nums[i] 与 nums[i-1] 是否相同。应该选择判断 nums[i] 与 nums[i-1] ,因为用另一种方法就把 三元组中出现重复元素的情况直接pass掉了。 例如{-1, -1 ,2} 这组数据,当遍历到第一个-1 的时候,判断 下一个也是-1,那这组数据就pass了。

当用左右指针分别指向 i +1 和 数组最后一位数。如果数字大于目标数,右指针减一,如果小于目标数,左指针加一。然后考虑左右指针去重问题,就是与后一个或者前一个数是否相等,相等就跳过的问题,很容易看代码理解不过多赘述了。

二、学了三数之和,四数之和也很好理解了。

其实就是在外多套用一层循环,对第一个数也做去重和剪枝。然后第二重循环和三数之和差不多。只是小细节需要注意。

我给出一些需要注意的地方:不能nums[i]>0 就返回值了,因为这里target可以是任意数,要将条件更正为 nums[i]>=0&&nums[i]>target 。

class Solution { public: vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>> result; sort(nums.begin(),nums.end()); for(int i=0;i<nums.size();i++){ if(nums[i]>=0&&nums[i]>target){ break; } if(i>0&&nums[i]==nums[i-1])continue; for(int j=i+1;j<nums.size();j++){ if(nums[j]+nums[i]>=0&&nums[j]+nums[i]>target){ break; } if(j>i+1&&nums[j]==nums[j-1])continue; int left=j+1,right=nums.size()-1; while(right>left){ if((long)nums[i]+nums[j]+nums[right]+nums[left]>target){ right--; }else if((long)nums[i]+nums[j]+nums[right]+nums[left]<target){ left++; }else{ result.push_back(vector<int>{nums[i],nums[j],nums[left],nums[right]}); while(right>left&&nums[left]==nums[left+1])left++; while(right>left&&nums[right]==nums[right-1])right--; left++; right--; } } } } return result; } };
http://www.jsqmd.com/news/706013/

相关文章:

  • 4月27日成都地区热镀锌角钢(安钢、晋南、盛财,型号 L30- L400)现货批发 - 四川盛世钢联营销中心
  • Fairseq-Dense-13B-Janeway创意写作模型助力Proteus仿真项目报告自动化
  • 2026测力传感器技术分享:静态称重传感器/高精度测力传感器/高精度称重传感器/S型测力传感器/动态称重传感器/选择指南 - 优质品牌商家
  • 2026年4月新消息:成都实力酒店装修公司深度解析与选择指南 - 2026年企业推荐榜
  • 国内外主流 RPA 厂商全解析:生态能力、合规治理、落地对比
  • 2026年4月南安优质中学推荐:南安市正观高级中学,多元升学路径的坚实保障 - 2026年企业推荐榜
  • 2026现阶段湖北市场优选工业塔填料供应商:马利冷却塔填料制造商的专业实力解析 - 2026年企业推荐榜
  • Cloudflare Sandbox SDK:在边缘网络安全运行不可信代码的实践指南
  • 2026年现阶段,如何甄选真正有实力的移动居住空间服务商?——以广东微墅科技为例 - 2026年企业推荐榜
  • 相邻节点迭代器
  • ARM平台PPP协议栈移植与优化实战指南
  • 2026现阶段实木地板批发厂家综合实力榜:苏州实木地板智造专家深度解析 - 2026年企业推荐榜
  • 2026年4月吉林地区S波填料优质供应商盘点:良机冷却塔填料智造专家入选 - 2026年企业推荐榜
  • 2026年当下重庆有机鱼深度解析:为何“昇鱼尚水”成为市场焦点? - 2026年企业推荐榜
  • 2026年当前辽宁地区康明冷却塔填料直销工厂甄选要点 - 2026年企业推荐榜
  • CREST分子构象搜索工具完整指南:从零开始掌握高效采样技术
  • 小爱音箱接入大模型实战:open-xiaoai-bridge项目部署与高级配置指南
  • ESP32智能继电器板开发与应用指南
  • 免费SVG编辑器终极指南:Method Draw让你的矢量图形设计变得简单高效
  • 2026优秀办公室装修技术指南:净化厂房装修、办公室设计、办公楼装修、厂房装修及设计、厂房设计、大型写字楼装修选择指南 - 优质品牌商家
  • 4月27日成都地区槽钢(晋南、翅冀、宝得,型号[6.3#-[40#)现货批发 - 四川盛世钢联营销中心
  • 2026养老院智能化技术全解析:养老院软件系统、智慧健康养老、智慧养老服务、智慧养老院系统、最近养老院、养老管理系统选择指南 - 优质品牌商家
  • Web Proofs与TEE代理:构建可信API交互的技术解析
  • 3分钟搞定Blender UV混乱?这个插件让你告别手动调整的烦恼!
  • 4月27日成都地区工字钢(昆钢、津西、日照,型号I‌‌10#-I‌63#)现货批发 - 四川盛世钢联营销中心
  • Maestro框架:用YAML简化移动端UI自动化测试
  • 2026年最新护墙板制造厂深度**:谁在引领环保与诚信新标准? - 2026年企业推荐榜
  • hyperf 可观测性方案大全
  • Akagi麻将AI实战指南:从零部署深度学习辅助系统
  • 基于RBF神经网络自适应调整虚拟惯性的逆变器VSG并网技术