- 注意先直接排序。
- 注意三个指针的遍历。
- sort的时间复杂度是 nlogn
- 注意中途的剪枝操作,可以避免重复的结果,加快搜索速度。
- 注意和最小位的相反数相等的原则。
class Solution { public: vector<vector<int> > threeSum(vector<int> &num) { vector<vector<int> > result; if(num.size()<3){ return result; } sort(num.begin(),num.end());// n(logn) for(int i = 0; i< num.size()-2;i++){ if(num[i] == num[i-1]&&i) continue;//去重复,主要是第二个元素开始有重复的情况 int l = i+1, r = num.size()-1; while(l<r){ if(num[l]+num[r]==-num[i]){ result.push_back({num[i],num[l],num[r]}); //优化 while(num[l] == num[l+1]&&l+1<r) l++;//i不变去重复 主要是l while(num[r] == num[r-1]&&l<r-1) r--;//i不变去重复 主要是r l++; r--; }else if(num[l]+num[r]>-num[i]){ r--; }else{ l++; } } } return result; } };