当前位置:网站首页>LeetCode15:三数之和
LeetCode15:三数之和
2022-08-03 14:05:00 【Hugh.L】
题目
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = []
输出:[]
示例 3:
输入:nums = [0]
输出:[]
提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
对于本题,评论区和题解区讨论热度都蛮高,看了很多例子后,应该也算是理解了题意,在此,再用自己的语言介绍一下思路。
思路可以简单概括为:排序+双指针+降重(减少复杂度)。思路的三个要点中,前两者都比较好理解和实现,主要是:
先将数组排序,数组有序后,先确定一个起始位置(默认第一位),再来一左一右两个指针,分别指向第一位和最末一位,计算三者之和,比较其与0的大小关系,如果比0大,左指针右移(减少和);比0小,右指针左移(增大和)。反复进行,直到找到三者之和恰好为0的组合。
至于降重,个人感觉是最需要细致考虑的一点,大佬考虑的可能更细。我在此介绍我理解的两点:
1,起始位置如果大于0,该种情况及其之后不用再考虑(毕竟数组有序递增后,最小的数大于0,肯定无法找出三个数之和等于0)
2,重复元素可以选择跳过(即后面的“起始位置”如果和前面的数相同,可以跳过)
实现
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
if(nums[i]>0){
return result;
}
if(i>0&& nums[i]==nums[i-1]){
continue;
}
int left=i+1;
int right=nums.size()-1;
while(right>left){
if(nums[i]+nums[left]+nums[right]>0){
right--;
}else if(nums[i]+nums[left]+nums[right]<0){
left++;
}else{
result.push_back(vector<int>{nums[i],nums[left],nums[right]});
while(right>left&&nums[right]==nums[right-1])right--;
while(right>left&&nums[left]==nums[left+1])left++;
right--;
left++;
}
}
}
return result;
}
};
边栏推荐
猜你喜欢
随机推荐
UE4 解决C盘缓存问题
关于 vditor 可否同步飞书文档问题
一文详解什么是软件部署
如何使用matlab实现分段函数「建议收藏」
爬虫——代理搭建、爬取视频网站、爬取新闻、BeautifulSoup4介绍、bs4 遍历文档树、bs4搜索文档树、bs4使用选择器
如何在 UE4 中制作一扇自动开启的大门
【二叉树】从二叉树一个节点到另一个节点每一步的方向
软件测试考证:ISTQB、软件评测师
ITSM软件与工单系统的区别是什么?
node项目开发踩坑(一)
chrome浏览器对应驱动_chrome手机浏览器
“芯片法案”通过后,美光承诺在美国扩产
【web渗透】CSRF漏洞详细讲解
GMapping principle analysis/easy to understand
如何合理安排一天,做到高效备考?
网络通信的过程
张乐:研发效能的黄金三角及需求与敏捷协作领域的实践|直播回顾
阿里大牛最新总结分享的高并发编程核心笔记(终极版),高并发系统架构场景一应俱全
淘特:引擎还是包袱?
不卷不pua,早9晚6,这个招聘深得我心