Note:
For example, given array S = {1 0 -1 0 -2 2}, and target = 0. A solution set is: (-1, 0, 0, 1) (-2, -1, 1, 2) (-2, 0, 0, 2)
类似问题:
找出序列中求和最接近于target的三个数 3Sum Closest
找出求和为0的三个数 3sum
思路:固定前两个数,寻找剩下两个数可能的值。为了使得四元组不重复,每一个位置的数不可以重复取。
代码:
class Solution { public: vector<vector<int> > fourSum(vector<int> &num, int target) { vector<vector<int> > result; int n = num.size(); sort(num.begin(), num.end()); if(n < 4) return result; for(int i=0;i<=n-4;i++) //i = first element { if(i>0 && num[i] == num[i-1]) //avoid duplicate continue; for(int j=i+1;j<=n-3;j++) // j = second element { if(j>i+1 && num[j] == num[j-1]) //avoid duplicate continue; // target - num[i] - num[j] // from j+1 to n-1 int left = j+1; // left = third element int right = n-1; // right = fourth element int cur; int ta = target - num[i] - num[j]; while(left < right) { cur = ta - num[left] - num[right]; if(cur == 0) { vector<int> tmp; tmp.push_back(num[i]); tmp.push_back(num[j]); tmp.push_back(num[left]); tmp.push_back(num[right]); result.push_back(tmp); left++; while(left < right && num[left-1] == num[left]) //avoid duplicate left++; right--; while(left < right && num[right+1] == num[right]) //avoid duplicate right--; } else if(cur > 0) { left++; while(left < right && num[left-1] == num[left]) //avoid duplicate left++; } else { right--; while(left < right && num[right+1] == num[right]) //avoid duplicate right--; } } } } return result; } };