@@ -244,56 +244,61 @@ int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** return
244244### Java:
245245
246246```Java
247- class Solution {
247+ import java.util.*;
248+
249+ public class Solution {
248250 public List<List<Integer>> fourSum(int[] nums, int target) {
249- List<List<Integer>> result = new ArrayList<>();
250- Arrays.sort(nums);
251-
252- for (int i = 0; i < nums.length; i++) {
253-
254- // nums[i] > target 直接返回, 剪枝操作
255- if (nums[i] > 0 && nums[i] > target) {
256- return result;
251+ Arrays.sort(nums); // 排序数组
252+ List<List<Integer>> result = new ArrayList<>(); // 结果集
253+ for (int k = 0; k < nums.length; k++) {
254+ // 剪枝处理
255+ if (nums[k] > target && nums[k] >= 0) {
256+ break;
257257 }
258-
259- if (i > 0 && nums[i - 1 ] == nums[i ]) { // 对nums[i]去重
258+ // 对nums[k]去重
259+ if (k > 0 && nums[k ] == nums[k - 1 ]) {
260260 continue;
261261 }
262-
263- for (int j = i + 1; j < nums.length; j++) {
264-
265- // nums[i]+nums[j] > target 直接返回, 剪枝操作
266- if (nums[i]+nums[j] > 0 && nums[i]+nums[j] > target) {
267- return result;
268- }
269-
270- if (j > i + 1 && nums[j - 1] == nums[j]) { // 对nums[j]去重
262+ for (int i = k + 1; i < nums.length; i++) {
263+ // 第二级剪枝
264+ if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) {
265+ break;
266+ }
267+ // 对nums[i]去重
268+ if (i > k + 1 && nums[i] == nums[i - 1]) {
271269 continue;
272270 }
273-
274- int left = j + 1;
271+ int left = i + 1;
275272 int right = nums.length - 1;
276273 while (right > left) {
277- // nums[k] + nums[i] + nums[left] + nums[right] > target int会溢出
278- long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];
274+ long sum = (long) nums[k] + nums[i] + nums[left] + nums[right];
279275 if (sum > target) {
280276 right--;
281277 } else if (sum < target) {
282278 left++;
283279 } else {
284- result.add(Arrays.asList(nums[i ], nums[j ], nums[left], nums[right]));
280+ result.add(Arrays.asList(nums[k ], nums[i ], nums[left], nums[right]));
285281 // 对nums[left]和nums[right]去重
286282 while (right > left && nums[right] == nums[right - 1]) right--;
287283 while (right > left && nums[left] == nums[left + 1]) left++;
288-
289- left++;
290284 right--;
285+ left++;
291286 }
292287 }
293288 }
294289 }
295290 return result;
296291 }
292+
293+ public static void main(String[] args) {
294+ Solution solution = new Solution();
295+ int[] nums = {1, 0, -1, 0, -2, 2};
296+ int target = 0;
297+ List<List<Integer>> results = solution.fourSum(nums, target);
298+ for (List<Integer> result : results) {
299+ System.out.println(result);
300+ }
301+ }
297302}
298303```
299304
0 commit comments