给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
示例 2:
输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]
提示:
1 <= nums.length <= 200
-109 <= nums[i] <= 109
-109 <= target <= 109
解题思路:
1、在三数之和的基础上再添上一层循环LeetCode 第15题 三数之和(附java和python代码)_萝萝荦荦的博客-CSDN博客
2、由于代码不过,对于数据状况特别差的两种情况做额外处理,如果target>0 且 nums中的值都<0,则没有满足要求的组合。如果target<0 且nums中的值都>0,也没有满足要求的组合
Java代码
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);
if(target>0){
boolean flg = false;
for(int i=0; i<nums.length; i++){
if(nums[i]>0){
flg = true;
}
}
if(!flg){
return result;
}
}
if(target<0){
boolean flg = false;
for(int i=0; i<nums.length; i++){
if(nums[i]<0){
flg = true;
}
}
if(!flg){
return result;
}
}
for(int i=0; i<nums.length; i++){
process(nums, target-nums[i], i, result);
}
return result;
}
public void process(int[] nums, int target, int start, List<List<Integer>> result){
for(int idx=start+1; idx<nums.length; idx++){
int left = idx + 1;
int right = nums.length - 1;
while(left<right){
int tmp = nums[idx] + nums[left] + nums[right];
List<Integer> resTmp = new ArrayList<>();
resTmp.add(nums[start]);
resTmp.add(nums[idx]);
resTmp.add(nums[left]);
resTmp.add(nums[right]);
if(tmp==target){
if(!result.contains(resTmp)){
result.add(resTmp);
}
left ++;
right --;
}else if(tmp>target){
right --;
}else {
left ++;
}
}
}
}
}
Python代码:
class Solution(object):
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
result = []
nums = sorted(nums)
if target > 0:
flg = False
for i in range(len(nums)):
if nums[i] > 0:
flg = True
break
if not flg:
return result
if target < 0:
flg = False
for i in range(len(nums)):
if nums[i] < 0:
flg = True
break
if not flg:
return result
for i in range(len(nums)):
self.process(nums, target-nums[i], i, result)
return result
def process(self, nums, target, start, result):
for idx in range(start+1, len(nums)):
left = idx + 1
right = len(nums) - 1
while left < right:
tmp = nums[idx] + nums[left] + nums[right]
resTmp = [nums[start], nums[idx], nums[left], nums[right]]
if tmp == target:
if resTmp not in result:
result.append(resTmp[:])
left += 1
right -= 1
elif tmp > target:
right -= 1
else:
left += 1
更多关于三数之和的题型可以参考