LeetCode[18]四数之和
思路:
做四数之和之前,我还真没想到能用三数之和来做,这三数之和真是白做了。0.0,四数也就是比三数多一个数而已,这个数再用for循环了便是,剩下的还是和三数之和一样,就剪枝也是和三数之和差不多,唯一区别就是这个不是四数相加等于0,而是四数相加等于一个target,第一个数比target大,这个显然行不通,因为第一个数可能是负数,比如-4,-1,0,0,-5,target=-5,那么第一个数明明可以,但却被我们剪掉了,这是不可以的,所以我们必须保证第一个数为正数的时候再和target进行比较。剩下的就和三数之和一样了,想看的朋友可以在我的题解里搜一下。
代码:
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
for (int k = 0; k < nums.length; k++) {
if (nums[k] > target && nums[k] >= 0)
break;
if (k > 0 && nums[k] == nums[k - 1])
continue;
for (int i = k + 1; i < nums.length; i++) {
if (nums[k] + nums[i] > 0 && nums[k] + nums[i] > target)
break;
if (i > k + 1 && nums[i] == nums[i - 1])
continue;
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
int sum = nums[k] + nums[i] + nums[left] + nums[right];
if (sum == target) {
res.add(Arrays.asList(nums[k], nums[i], nums[left], nums[right]));
while (left < right && nums[left] == nums[left + 1])
left++;
while (left < right && nums[right] == nums[right - 1])
right--;
left++;
right--;
} else if (sum > target) {
right--;
} else {
left++;
}
}
}
}
return res;
}
}