文章目录

一、题目链接:三数之和
二、思路讲解
方法二:找规律
1.我们首先sort迭代器进行排序
2.排完序后我们开始遍历
3.如果从i=0开始遍历,left=i+1,right=n-1
4.优化:判断nums[i]是否大于0,大于0,后面的数都是单增的就直接break跳出
5.取nums[i]的相反数sum,判断sum和a[left]+a[right]的大小关系,如果sum大于a[left]+a[right],那么left++,小于的话就right–,同时要满足left<right
6.为了去重,判断下一个left和前一个left是否相同,下一个right和前一个right是否相同,相同就继续向前走,i也是
7.时间复杂度O(n^3+nlogn)
三、代码演示
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> arr;
sort(nums.begin(),nums.end());
int i = 0,n = nums.size();
for(i=0;i<n;)
{
if(nums[i]>0)
break;
int left = i+1,right = n-1,target = -nums[i];
while(left<right)
{
int sum = nums[left]+nums[right];
if(sum>target) right--;
else if(sum<target) left++;
else
{
arr.push_back({nums[i],nums[left],nums[right]});
left++,right--;
while(left<right&&nums[left]==nums[left-1]) left++;
while(left<right&&nums[right]==nums[right+1]) right--;
}
}
i++;
while(i<n&&nums[i]==nums[i-1]) i++;
}
return arr;
}
};