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;
    }
};