参考资料:
https://leetcode.com/problems/3sum/discuss/7402/Share-my-AC-C%2B%2B-solution-around-50ms-O(N*N)-with-explanation-and-comments
https://www.cnblogs.com/grandyang/p/4481576.html
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int> > res; std::sort(nums.begin(), nums.end()); for (int i = 0; i < nums.size(); i++) { int target = -nums[i]; int front = i + 1; int back = nums.size() - 1; while (front < back) { int sum = nums[front] + nums[back]; // Finding answer which start from numsber nums[i] if (sum < target) front++; else if (sum > target) back--; else { vector<int> triplet(3, 0); triplet[0] = nums[i]; triplet[1] = nums[front]; triplet[2] = nums[back]; res.push_back(triplet); // Processing duplicates of numsber 2 // Rolling the front pointer to the next different numsber forwards while (front < back && nums[front] == triplet[1]) front++; // Processing duplicates of numsber 3 // Rolling the back pointer to the next different numsber backwards while (front < back && nums[back] == triplet[2]) back--; } } // Processing duplicates of numsber 1 while (i + 1 < nums.size() && nums[i + 1] == nums[i]) i++; } return res; } };