美文网首页
LeetCode 第18题:四数之和

LeetCode 第18题:四数之和

作者: 放开那个BUG | 来源:发表于2021-04-23 14:06 被阅读0次

1、前言

题目描述

2、思路

采用三数之和的思路,原本三数之和可以分解为:数组中的一个数 + 此数右边的数求两数之和,那么四数之和的思路:数组中的一个数 + 此数右边的数求三数之和,有点类似与分治法,分而治之。

3、代码

public class FourSum {

    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            List<List<Integer>> list = threeSumTarget(nums, i + 1, target - nums[i]);
            for (List<Integer> integers : list) {
                integers.add(nums[i]);
                res.add(integers);
            }
            while (i < nums.length - 1 && nums[i] == nums[i + 1]) i++;
        }
        return res;
    }

    private List<List<Integer>> threeSumTarget(int[] nums, int start, int target) {
        List<List<Integer>> res = new ArrayList<>();
        for (int i = start; i < nums.length; i++) {
            List<List<Integer>> list = twoSumTarget(nums, i + 1, target - nums[i]);
            for (List<Integer> integers : list) {
                integers.add(nums[i]);
                res.add(integers);
            }
            while (i < nums.length - 1 && nums[i] == nums[i + 1]) i++;
        }

        return res;
    }

    private List<List<Integer>> twoSumTarget(int[] nums, int start, int target) {
        List<List<Integer>> res = new ArrayList<>();
        int left = start, right = nums.length - 1;
        while (left < right){
            int lowNum = nums[left], highNum = nums[right];
            int sum = lowNum + highNum;
            if(sum < target){
                while(left < right && nums[left] == lowNum) left++;
            }else if(sum > target){
                while (left < right && nums[right] == highNum) right--;
            }else if(sum == target){
                List<Integer> list = new ArrayList<>();
                list.add(nums[left]);
                list.add(nums[right]);
                res.add(list);
                while(left < right && nums[left] == lowNum) left++;
                while (left < right && nums[right] == highNum) right--;
            }
        }
        return res;
    }


    public static void main(String[] args) {
        int[] nums = {1,0,-1,0,-2,2};
        int target = 0;
        List<List<Integer>> res = new FourSum().fourSum(nums, target);
        for (List<Integer> re : res) {
            for (Integer integer : re) {
                System.out.print(integer + "    ");
            }
            System.out.println();
        }
    }
}

相关文章

网友评论

      本文标题:LeetCode 第18题:四数之和

      本文链接:https://www.haomeiwen.com/subject/aybulltx.html