描述
给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d)。
四元组(a, b, c, d)中,需要满足a <= b <= c <= d
答案中不可以包含重复的四元组。
样例
例如,对于给定的整数数组S=[1, 0, -1, 0, -2, 2] 和 target=0. 满足要求的四元组集合为:
(-1, 0, 0, 1)
(-2, -1, 1, 2)
给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d)。
四元组(a, b, c, d)中,需要满足a <= b <= c <= d
答案中不可以包含重复的四元组。
样例
例如,对于给定的整数数组S=[1, 0, -1, 0, -2, 2] 和 target=0. 满足要求的四元组集合为:
(-1, 0, 0, 1)
(-2, -1, 1, 2)
(-2, 0, 0, 2)
分析
借助三数求和的思想,除了考虑重复的数组之外,需要把前两个数定下来,然后转化为三数求和问题。
程序
class Solution { public: /** * @param numbers: Give an array * @param target: An integer * @return: Find all unique quadruplets in the array which gives the sum of zero */ vector<vector<int>> fourSum(vector<int> &numbers, int target) { // write your code here //借助三个数之和的思想,此时时间复杂段为O(n^3),空间复杂度为O(1) vector<vector<int> > result; sort(numbers.begin(), numbers.end()); for (int i = 0; i < numbers.size(); i++){//固定住第一个数 if (i > 0 && numbers[i] == numbers[i - 1]) continue; for (int j = i + 1; j < numbers.size(); j++){//固定住第二个数 if (j > i + 1 && numbers[j] == numbers[j - 1]) continue; for (int k = j + 1, h = numbers.size() - 1; k < h;){ if (k > j + 1 && numbers[k] == numbers[k - 1]){ k++; continue; } if (h < numbers.size() - 1 && numbers[h] == numbers[h + 1]){ h--; continue; } int sum = numbers[i] + numbers[j] + numbers[k] + numbers[h]; if (sum < target) k++; else if (sum > target) h--; else { vector<int> v(4, numbers[i]); v[1] = numbers[j]; v[2] = numbers[k++]; v[3] = numbers[h--]; result.push_back(v); } } } } return result; } };