题目:
从给定的一堆数字中找出 所有 4个数之和=taget的组合。组合与组合之间不得重复
Given an array nums
of n integers and an integer target
, are there elements a, b, c, and d in nums
such that a + b + c + d = target
? Find all unique quadruplets in the array which gives the sum of target
.
Note:
The solution set must not contain duplicate quadruplets.
Example:
Given array nums = [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] ]
解答:
#C++版本(观摩了 leetcode讨论区的大佬)
class K_Sum{
public:
vector<vector<int>> k_Sum(vector<int>& nums,int target,int k){
if(nums.size()<k){
return {};
}
sort(nums.begin(),nums.end());
return k_sum_helper(nums,target,k,0);
}
private:
vector<vector<int>> k_sum_helper(vector<int>& nums,int target,int k,int begin_index){
if(begin_index == nums.size() || k*nums[begin_index] > target || k*nums[nums.size()-1] <target){
return {};
}
vector<vector<int>> result;
if (k == 2) {
for (int left = begin_index, right = nums.size() - 1; left < right;
++left) {
while (left < right && nums[left] + nums[right] > target) {
--right;
}
if (left == right) return result;
if (nums[left] + nums[right] == target) {
result.push_back({nums[left], nums[right]});
}
else if (right != nums.size() - 1) ++right;
while (left < right && nums[left + 1] == nums[left]) ++left;
}
return result;
}
for(int i=begin_index;i+k<=nums.size();i++){
auto temp_result=k_sum_helper(nums,target-nums[i],k-1,i+1);
for(auto & v :temp_result){
v.push_back(nums[i]);
result.emplace_back(std::move(v));
}
while(i+k<nums.size() && nums[i]==nums[i+1]) i++;
}
return result;
}
};
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
return K_Sum().k_Sum(nums, target, 4);
}
};
#Python 版本
class Solution:
def fourSum(self, nums, target):
ans=[]
nums.sort()
for i in range(0,len(nums)):
for j in range(i+1,len(nums)):
k,z=j+1,len(nums)-1
while k<z:
sum_=nums[i]+nums[j]+nums[k]+nums[z]
if sum_==target:
ans_1=[nums[i],nums[j],nums[k],nums[z]]
if ans_1 not in ans:
ans.append(ans_1)
k+=1
z-=1
continue
else:
k+=1
z-+1
else:
if sum_>target:
z-=1
else:
k+=1
return ans