解题思路:本题总体思路不难,先对数组进行排序,确保遍历过程中不会出现重复值,完成第一步去重然后把三数之和理解简化为两数之和,先确定第一个数,再用双指针去寻找两数之和等于确定的第一个数 。
总体思路不难就是两数之和的进阶版,就是修枝比较麻烦 细节去重要处理到位。
15. 三数之和
给你一个包含 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
c++代码
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
//定义一个集合数组存储答案
vector<vector<int>> ans;
int n = nums.size();
int low,high;
//都没有三肯定没有解
if(n<3)
return {};
//sort排序
sort(nums.begin(),nums.end());
//循环遍历数组确认第一个数
for(int i=0;i<n;i++){
//排序后第一个数都大于0,则不存在解
if(nums[0]>0)
return {};
//大于0以后的数无需遍历了
if(nums[i]>0){
continue;
}
//对于第一个数再去重
if(i>0 && nums[i]==nums[i-1])
continue;
//第一个数
int target= -nums[i];
low = i+1;
high= n-1;
//用双指针法搜索答案
while(low<high){
if(nums[low]+nums[high]<target)
low++;
else if(nums[low]+nums[high]>target)
high--;
else
{
//答案存入数组
ans.push_back({nums[i],nums[low],nums[high]});
low++;
high--;
//第二个数在去重
while(low<high && nums[low]==nums[low-1])
low++;
//第三个数在去重
while(low<high && nums[high]==nums[high+1])
high--;
}
}
}
return ans;
}
};
刷题的过程总是这样的,痛苦而漫长但是每每ak了一道题就会带来无限的成就与自豪感!祝大家都可以坚持自己所追求的事!