1. 程式人生 > >15. 3Sum的C++解法

15. 3Sum的C++解法

利用之前做過兩數之和的思路,可以固定一個數字,剩下的按兩數之和的方法進行查詢。 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;
	}
};