15. 3Sum的C++解法
阿新 • • 發佈:2018-12-17
利用之前做過兩數之和的思路,可以固定一個數字,剩下的按兩數之和的方法進行查詢。 1.為了防止重複,查詢從固定數字的後面找。 2.同一個固定數字下也有可能解不唯一,所以迴圈不能是找到符合條件的就退出,而應該遍歷所有可能。 3.隨時判斷越界和下標相等。 4.技巧:如果taget已經是正數了就終止,因為後面不可能出現和為零的組合了。
class Solution { public: vector<vector<int>> threeSum(vector<int> &numbers) { vector<vector<int>> res; sort(numbers.begin(), numbers.end()); int l = numbers.size(); for (int k = 0; k < l-2; k++) { if(numbers[k]>0) break; if ((k>0)&&(numbers[k] == numbers[k - 1])) continue; int target = -1* numbers[k]; int i =k+1; int j = numbers.size() - 1; while (i<j) { if (numbers[i] + numbers[j] > target)j--; if (numbers[i] + numbers[j] < target) i++; if (numbers[i] + numbers[j] == target && i!=j) { res.push_back(vector < int > { numbers[k], numbers[i], numbers[j] }); while (i < j && numbers[i] == numbers[i + 1]) ++i; while (i < j && numbers[j] == numbers[j - 1]) --j; i++; j--; } } } return res; } };