标签:
问题描述:点击打开链接 leetcode
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
For example, given array S = {-1 0 1 2 -1 -4}, A solution set is: (-1, 0, 1) (-1, -1, 2)
解析:
首先排序,然后左右夹逼,复杂度O(n^2) -- 从程序中可以看出
此方法可扩展到 k-sum (即求k个数的和等于target),先排序,然后做 k-2 次循环,在最内层循环中左右夹逼;时间复杂度为\[\max (O(nlogn),O({n^{k - 1}}))\]
(排序O(nlogn), 循环\[O({n^{k - 1}})\])
#include <iostream> #include <vector> #include <algorithm> using namespace std; class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector< vector<int> > result; if (nums.size() < 3) return result; sort(nums.begin(), nums.end()); int target = 0; for (int i = 0; i < nums.size()-2; i++) { int j = i+1; int k = nums.size() - 1; if (i > 0 && nums[i] == nums[i-1]) continue; while (j < k) { int sum = nums[i] + nums[j] + nums [k]; if (sum < target) { j++; while (j < k && nums[j] == nums[j-1]) j++; } else if (sum > target) { k--; while (j < k && nums[k] == nums[k+1]) k--; } else { int t[] = {nums[i], nums[j], nums[k]}; vector<int> temp(t, t+3); result.push_back(temp); cout << nums[i] << " "<< nums[j] << " " << nums[k] << endl; j++; k--; while (j < k && nums[j] == nums[j-1] && nums[k] == nums[k+1])//只有两个都等时,需要改变一个 j++; } } } return result; } }; int main() { int test1[] = {-1, 0, 1, 2, -1, -4}; int test2[] = {-1, 0, 1}; int test4[] = {-1, 0}; int test3[] = {2, 3, -2, 0, -10, 4, 6}; vector<int> nums(test1, test1+6); vector<int> nums2(test2, test2+3); vector<int> nums3(test3, test3+7); vector<int> nums4(test4, test4+2); Solution sol; sol.threeSum(nums); sol.threeSum(nums2); sol.threeSum(nums3); sol.threeSum(nums4); }
标签:
原文地址:http://blog.csdn.net/quzhongxin/article/details/45888145