
原题链接
- 此题是三数之和的变换
- 不再要求和 为0 ,而是任意的target
- 同理:但是此处需要两层for循环,每一层for循环后都要跟一个去重操作,去重的时候,都要满足当前的位置不是循环开始的位置,即 第一层时,要求i > 0 … 第二层时要求 j > i + 1…
- 之后的操作和之前相同
- 二刷:处不用判断nums[i] > 0 的情况,因为此处不是要判断sum 为 0 的情况,而是与一个随机的target来比较
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
for(int i = 0; i < nums.length; i++){
if (i > 0 && nums[i - 1] == nums[i]) {
continue;
}
for(int j = i + 1; j < nums.length; j++){
if (j > i + 1 && nums[j - 1] == nums[j]) {
continue;
}
int left = j + 1;
int right = nums.length - 1;
while(right > left){
int sum = nums[i] + nums[j] + nums[left] + nums[right];
if(sum > target) right--;
else if(sum < target) left++;
else{
res.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
while(right > left && nums[right] == nums[right - 1]) right--;
while(right > left && nums[left] == nums[left + 1]) left++;
right--;
left++;
}
}
}
}
return res;
}
}