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

【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. 两数之和三数之和四数之和系列对比,理解解题套路。

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

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

http://www.cnnetsun.cn/news/3984934.html

相关文章:

  • 不强迫高强度报班,利用碎片时间培养艺术感知教
  • 揭秘专业足球网站建设背后的真相:如何让您的俱乐部官网既专业又接地气并提升用户粘性?
  • Applera1n:免费解锁iOS 15-16.6.1设备激活锁的完整指南
  • 先进封装,正在接过摩尔定律的下一棒
  • C++移动语义陷阱:std::move为何失效?拷贝构造与移动构造的深层解析
  • 揭秘电子商务网站建设的一般流程:从0到1打造高转化官网的避坑指南
  • 从HTML到Markdown:详解灰色文本框的实现原理与多平台实践
  • 大厂的 GPU 为什么比你利用率高一倍?动态调度底层原理
  • 第 3 章 FOC 前置数学基石:Clark 变换
  • 番禺市桥网站建设多少钱一次?2024年本地商家避坑指南与实战经验分享
  • 审小匠 vs ERP 项目模块与手工 Excel:研发费用台账的税会口径差异评测
  • 前端多Tab状态同步:三层架构解决消息漂移难题
  • 手写MCP文件读写Server:为AI大模型打造安全可控的本地文件操作能力
  • Kimi LeetCode 3878. 统计好子数组 Rust实现
  • Ubuntu24.04双系统安装实操
  • 房产下行周期中的闲置资产破局之道:商业拍卖重要性凸显
  • 电脑本地 AI 自动化怎么玩,OpenClaw 从安装到执行任务(含安装包)
  • 建设学分银行网站策划书:打造终身学习数字枢纽的落地指南与深度解析
  • 增长放缓、估值较低,Dropbox为何成私募股权投资理想目标?
  • 揭秘乐清市住房和城乡建设规划局网站如何助力市民便捷办事与城市更新政策解读
  • Kimi LeetCode 3883. 统计满足数位和数组的非递减数组数目 Golang实现
  • 如何用wxlivespy构建企业级微信视频号直播数据监控系统
  • Steam游戏自动破解:如何快速实现离线游戏完整指南
  • Android SQLite数据库开发实战:从SQLiteOpenHelper到DAO模式完整指南
  • 网站建设与管理复习知识点:资深运维人揭秘网站全生命周期核心奥秘与避坑指南
  • 探索眉山建设中等职业技术学校网站:学子升学与就业的双重机遇指南,解读民办职业教育新标杆
  • 维普论文AI检测降重策略与语义重构技术详解
  • 当 human in the loop 变成“闭着眼睛点确认”,企业Agent 安全还能靠谁?
  • [光学原理与应用-500]:
  • 语言如何泄露思维模式:从词汇、句法到隐喻的认知分析