LeetCode系列(四)-4Sum

  给定一个包含 n 个整数的数组 nums 和一个目标值 target,
  判断 nums 中是否存在四个元素 a,b,c 和 d ,
  使得 a + b + c + d 的值与 target 相等?
  找出所有满足条件且不重复的四元组。

示例:

  给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
  满足要求的四元组集合为:
  [
   [-1, 0, 0, 1],
   [-2, -1, 1, 2],
   [-2, 0, 0, 2]
  ]

 

解法:

1.两层for循环套一个双指针求和。优化:去重。

    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List<List<Integer>> list = new ArrayList<>();
        for (int i = 0; i < nums.length-3; i++) {
            // 第一个数去重
            if (i==0||(i>0&&(nums[i]!=nums[i-1]))) {
                 for (int j = i + 1; j < nums.length - 2; j++) {
                    // 第二个数去重
                    if (j==i+1||(j>i+1&&(nums[j]!=nums[j-1]))) {
                        int lo = j + 1;
                        int hi = nums.length - 1;
                        int sum = nums[i] + nums[j] - target;
                        while (lo<hi) {
                            if (nums[lo] + nums[hi] == -sum) {
                                list.add(Arrays.asList(nums[i], nums[j], nums[lo], nums[hi]));
                                // 三四数去重
                                while (lo<hi&&nums[lo]==nums[lo+1]) lo++;
                                while (lo<hi&&nums[hi]==nums[hi-1]) hi--;
                                lo++;
                                hi--;
                            } else if (nums[lo] + nums[hi] > -sum) {
                                hi--;
                            } else {
                                lo++;
                            }
                        }
                    }
                }
            }
        }
        return list;
    }

 2.优化去重方法,使用list自带函数去重。但是会增加循环次数。

    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List<List<Integer>> list = new ArrayList<>();

        for (int i = 0; i < nums.length-3; i++) {
            for (int j = i + 1; j < nums.length - 2; j++) {
                int lo = j + 1;
                int hi = nums.length - 1;
                int sum = nums[i] + nums[j] - target;
                while (lo<hi) {
                    if (nums[lo] + nums[hi] == -sum) {
                        if (!list.contains(Arrays.asList(nums[i], nums[j], nums[lo], nums[hi]))) {
                            list.add(Arrays.asList(nums[i], nums[j], nums[lo], nums[hi]));
                        }
                        lo++;
                        hi--;
                    } else if (nums[lo] + nums[hi] > -sum) {
                        hi--;
                    } else {
                        lo++;
                    }
                }
            }
        }
        return list;
    }

 

posted @ 2018-09-11 12:54  天才小彩笔i  阅读(113)  评论(0编辑  收藏  举报