双指针。
先排序,然后固定一个数,用双指针从两端遍历得到其他两个数。注意去重复。

class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &num) {
        vector<vector<int> > ans;
        sort(num.begin(), num.end());
        int len = num.size();
        for(int i = 0; i < len; i++)
        {
            if (i != 0 && num[i] == num[i - 1])
                continue;
            int target = -num[i];
            int left = i + 1, right = len - 1;
            while(left < right)
            {
                if(num[left] + num[right] == target)
                {
                    int temp[3] = {num[i], num[left], num[right]};
                    vector<int> vec(temp, temp + 3);
                    ans.push_back(vec);
                    while (left < right && num[left] == num[left + 1])
                        left++;
                    while (left < right && num[right] == num[right - 1])
                        right--;
                    left++;
                    right--;
                }
                else if(num[left] + num[right] < target)
                    left++;
                else
                    right--;
            }
        }
        return ans;
    }
};