三数之和思路:先把数组排序。把i下标的数据定为target,还是利用双向指针,遍历i+1到n的结果有没有相等的,有的话还要把left指针往后,right的指针往前,然后再判断数据有没有重复,有的话继续往下走,直到left>right循环结束装下所有不重复的结果,注意判断不重复的条件当前的值不等于前一个。然后还有就是如果当前三个数值都比0大,直接结束循环,因为后面的都比0大;如果当前加两个最大的比0小,直接continue,因为这个一趟不会找到等于0的数了。
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());vector<vector<int>>ans;int target,left,right;for(int i = 0;i<nums.size()-2;i++){left=i+1;right=nums.size()-1;target = -nums[i];//新的和前一个的一样的就不用再比了if(i>0&&target+nums[i-1]==0){continue;}//如果最小三个都比0大,后面不用比了if((nums[i]+nums[i+1]+nums[i+2])>0)break;//如果当前和最大的两个比小于0,则i直接下一个if((nums[i]+nums[right]+nums[right-1])<0)continue;while(left<right){if(target==(nums[left]+nums[right])){vector<int>temp;temp.push_back(-target);temp.push_back(nums[left]);temp.push_back(nums[right]);ans.push_back(temp);left++;right--;//去掉重复的情况while(left<right&&nums[left]==nums[left-1])left++;while(left<right&&nums[right]==nums[right+1])right--;}if(target>nums[left]+nums[right]){left++;}if(target<nums[left]+nums[right]){right--;}}}return ans;}
};