注意题目没要求数字只能用一次
a + b + c = 0 即为 -b=a+c,同时要求数字不全为正(然后发现a+b+c就行。。。不过多想想没坏处嘛)
先处理特殊情况,然后
先排序
注意不重复,只需要有一个数不同就行
排序后
对于某组a + b + c = 0 a最小,b,c大于a(都在a的右侧),范围在index【a】-len,这样从两边逼近,时间复杂度最低(可能有多组符合情况)
然后就是遍历,从0-n,得a找bc。因为不重复,nums[I]=NUMS[I-1]就跳过.同时匹配到了b,c后,b++,c--,也要去掉相同的数
然后刚刚想到的同时要求数字不全为正,所以nums[i]>0就没必要继续了
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>>ret; if(nums.empty()) return ret; int len=nums.size(); if(len<3) return ret; sort(nums.begin(),nums.end()); for (int i = 0; i < len - 2; i++) { if (nums[i] > 0) break; if (i > 0 && nums[i] == nums[i - 1]) continue; int l = i + 1; int r = len - 1; while (l < r) { //多组 int s = nums[i] + nums[l] + nums[r]; if (s > 0) r--; else if (s < 0) l++; else { ret.push_back({nums[i], nums[l], nums[r]}); while (l < r && nums[l] == nums[++l]); while (l < r && nums[r] == nums[--r]); } } } return ret; } };