news 2026/8/12 17:36:43

【LeetCode】18.四数之和

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【LeetCode】18.四数之和

欢迎来到李耶的频道【LeetCode面试题】。


四数之和

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

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

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

解法一:排序 + 双指针(通用模板)

思路:在三数之和的基础上多加一层循环。先排序,然后用两层循环固定前两个数,再用双指针在右侧区间寻找后两个数。注意每一层都需要跳过重复元素。

functionfourSum(nums,target){constresult=[];nums.sort((a,b)=>a-b);for(leti=0;i<nums.length-3;i++){// 跳过重复的第一个数if(i>0&&nums[i]===nums[i-1])continue;for(letj=i+1;j<nums.length-2;j++){// 跳过重复的第二个数if(j>i+1&&nums[j]===nums[j-1])continue;letleft=j+1;letright=nums.length-1;while(left<right){constsum=nums[i]+nums[j]+nums[left]+nums[right];if(sum===target){result.push([nums[i],nums[j],nums[left],nums[right]]);// 跳过重复的 leftwhile(left<right&&nums[left]===nums[left+1])left++;// 跳过重复的 rightwhile(left<right&&nums[right]===nums[right-1])right--;left++;right--;}elseif(sum<target){left++;}else{right--;}}}}returnresult;}
  • 时间复杂度 / 空间复杂度:O(n³) / O(log n) 或 O(n)
    • 三层循环 O(n³),排序 O(n log n),总体 O(n³)
    • 空间复杂度取决于排序算法
  • 优势:最推荐,是三数之和的通用扩展,模板可以继续扩展到 N 数之和

解法二:排序 + 双指针 + 剪枝优化

思路:在解法一的基础上增加剪枝逻辑,提前跳过不可能的情况,大幅提升效率。

functionfourSum(nums,target){constresult=[];nums.sort((a,b)=>a-b);constn=nums.length;for(leti=0;i<n-3;i++){if(i>0&&nums[i]===nums[i-1])continue;// 剪枝:最小和大于 target,后续更大,直接 breakif(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target)break;// 剪枝:最大和小于 target,当前 i 不可能,continueif(nums[i]+nums[n-3]+nums[n-2]+nums[n-1]<target)continue;for(letj=i+1;j<n-2;j++){if(j>i+1&&nums[j]===nums[j-1])continue;// 剪枝:最小和大于 targetif(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target)break;// 剪枝:最大和小于 targetif(nums[i]+nums[j]+nums[n-2]+nums[n-1]<target)continue;letleft=j+1;letright=n-1;while(left<right){constsum=nums[i]+nums[j]+nums[left]+nums[right];if(sum===target){result.push([nums[i],nums[j],nums[left],nums[right]]);while(left<right&&nums[left]===nums[left+1])left++;while(left<right&&nums[right]===nums[right-1])right--;left++;right--;}elseif(sum<target){left++;}else{right--;}}}}returnresult;}
  • 时间复杂度 / 空间复杂度:O(n³) / O(log n),剪枝后实际运行效率大幅提升
  • 优势:剪枝优化后性能更优,面试中是加分项

解法对比

解法时间 / 空间复杂度剪枝优化推荐指数
排序 + 双指针O(n³) / O(log n)⭐⭐⭐⭐
排序 + 双指针 + 剪枝O(n³) / O(log n)⭐⭐⭐⭐⭐

N 数之和通用模板

可以继续扩展到 N 数之和:

functionnSum(nums,n,target,start){constresult=[];if(n===2){// 两数之和(双指针)letleft=start;letright=nums.length-1;while(left<right){constsum=nums[left]+nums[right];if(sum===target){result.push([nums[left],nums[right]]);while(left<right&&nums[left]===nums[left+1])left++;while(left<right&&nums[right]===nums[right-1])right--;left++;right--;}elseif(sum<target){left++;}else{right--;}}}else{for(leti=start;i<nums.length-n+1;i++){if(i>start&&nums[i]===nums[i-1])continue;constsubResult=nSum(nums,n-1,target-nums[i],i+1);for(letarrofsubResult){result.push([nums[i],...arr]);}}}returnresult;}

扩展题

  1. N 数之和:给定数组和正整数n,找出所有和为targetn元组。
  2. 最接近的四数之和:给定数组和目标值target,找出和最接近target的一个四元组,返回这个和。
  3. 四数之和 II:给定四个整数数组ABCD,计算有多少个元组(i, j, k, l)使得A[i] + B[j] + C[k] + D[l] == 0
  4. 两数之和三数之和四数之和系列对比,理解解题套路。

“虚心使人进步,骄傲使人落后。” —— 毛泽东

关注李耶,每天一道面试题,一起卷起来 🔥

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/12 17:36:42

不强迫高强度报班,利用碎片时间培养艺术感知教

很多家长对艺术教育存在一种误解&#xff0c;以为必须把孩子送进昂贵的兴趣班&#xff0c;请专业老师指导&#xff0c;才算开始了艺术启蒙。于是周末被排得满满当当&#xff0c;孩子背着画板奔波于各个教室之间&#xff0c;反而对原本喜欢的绘画或音乐产生了抵触情绪。其实艺术…

作者头像 李华
网站建设 2026/8/12 17:36:24

揭秘专业足球网站建设背后的真相:如何让您的俱乐部官网既专业又接地气并提升用户粘性?

在这个数字媒体高度发达的时代,几乎每个人都可以通过手机随时随地获取最新的体育资讯。但是对于那些真正热爱足球、致力于运营自己的业余俱乐部、青训机构或者是小型职业球队的人来说,拥有一个高质量、专业且独具特色的官方网站,往往是被忽略却又至关重要的一环。很多时候,…

作者头像 李华
网站建设 2026/8/12 17:34:21

Applera1n:免费解锁iOS 15-16.6.1设备激活锁的完整指南

Applera1n&#xff1a;免费解锁iOS 15-16.6.1设备激活锁的完整指南 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 你是否有一台因iCloud激活锁而无法使用的iPhone或iPad&#xff1f;面对昂贵的官方解…

作者头像 李华
网站建设 2026/8/12 17:32:59

先进封装,正在接过摩尔定律的下一棒

一场西安会议里&#xff0c;藏着算力竞赛的下一个底座先进封装&#xff0c;正在接过摩尔定律的下一棒。8月5日—7日&#xff0c;第27届电子封装技术国际会议&#xff08;ICEPT 2026&#xff09;在西安召开。三天议程里排的都是2.5D/3D封装、Chiplet异构集成、混合键合相关的专题…

作者头像 李华
网站建设 2026/8/12 17:32:05

C++移动语义陷阱:std::move为何失效?拷贝构造与移动构造的深层解析

1. 问题场景与核心困惑 最近在代码Review里&#xff0c;又看到一个老生常谈但极易踩坑的问题&#xff1a;一个C类&#xff0c;明明白白地实现了拷贝构造函数&#xff0c;但没写移动构造函数。然后&#xff0c;开发同学为了“优化性能”&#xff0c;很自然地在某个地方用了 std…

作者头像 李华
网站建设 2026/8/12 17:31:50

揭秘电子商务网站建设的一般流程:从0到1打造高转化官网的避坑指南

在如今这个流量为王的时代,很多老板和创业者都有这样一个困惑:明明产品很好,供应链也很稳,可为什么在网上的生意就是做不起来?很多人第一反应是“是不是广告没投够?”或者“是不是主播不够火?”但其实,如果你回头去看看你的官方网站,或者你那个商城小程序的底层逻辑,…

作者头像 李华