C++、双指针
本题主要利用双指针,在确定一个数据的基础上,利用双指针确定另外两个数据。复杂在于不得重复,即去重语句的考虑。若添加位置错误或考虑欠缺,则会导致结果的减少或重复。
class Solution { public: vector<vector<int> > threeSum(vector<int> &num) { vector<vector<int> > ans; int n = num.size(); if (n < 3) return ans; sort(num.begin(), num.end());//题目要求有序,而且排序后更加便于查找符合要求的三元组 for (int i = 0; i < n; i++) { if (num[i] > 0)//排序后第一个元素大于零,则全部大于零,直接返回。 break; if (i > 0 && num[i] == num[i - 1]) continue;//去重 int left = i + 1, right = n - 1; while (right > left) {//可以看作一种去重,主要为循环终止条件 if (num[left] + num[right] + num[i] > 0) right--; else if(num[left] + num[right] + num[i] < 0)//注意此处的else不可省略,否则只能判断一次num[left] + num[right] + num[i]>0是否成立,这样显然会多录入几组不符合要求的结果,出错 left++; else { ans.push_back({num[i], num[left], num[right]}); while(right > left && num[left] == num[left + 1]) left++; while(right > left && num[right] == num[right - 1]) right--;//注意以上两个去重语句的位置,加入提前放置,则会导致录入的数据少(例如,若为num数组为{1,1,1},则若去重语句位置提前,则1,1,1不会录入) left++; right--; } } } return ans; } };