双指针。
先排序,然后固定一个数,用双指针从两端遍历得到其他两个数。注意去重复。
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; } };