[LeetCode15]3Sum

Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.

    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)
分析
先排序,然后左右夹逼,复杂度 O(n2)。
这个方法可以推广到 k-sum,先排序,然后做 k − 2 次循环,在最内层循环左右夹逼,
时间复杂度是 O(max{n log n, nk−1})。

class Solution15{
	public:
		vector<vector<int>>threeSum(vector<int>& num){
			vector<vector<int>> result;
			if (num.size() < 3) return result;
			sort(num.begin(), num.end());
			const int target = 0;
			/*vector<int>::iterator iter;
			for (iter = num.begin(); iter != num.end(); iter++){
				cout << *iter << endl;
			}*/
			auto last = num.end();
			for (auto i = num.begin(); i < last - 2; ++i){
				auto j = i + 1;
				if (i>num.begin() && *i == *(i - 1)) continue;
				auto k = last - 1;
				while (j < k){
					if (*i + *j + *k < target){
						++j;
						while (*j == *(j - 1) && j < k)++j;
					}
					else if (*i + *j + *k>target){
						--k;
						while (*k == *(k + 1) && j < k)--k;
					}
					else{
						result.push_back({ *i, *j, *k });
						++j;
						--k;
						while (*j == *(j - 1) && *k == *(k + 1) && j < k)++j;
					}
				}
			}
			return result;
		}
};

int main15(){
	Solution15 solution;
	
	vector<int> vec = { -1, 0, 1, 2, -1, -4 };
	solution.threeSum(vec);

	getchar();
	return 0;
	

}







你可能感兴趣的:([LeetCode15]3Sum)