【力扣】nSum问题模板

nSum问题模板

两数之和、三数之和、四数之和。

private List<List<Integer>> nSum(int[] nums, long target, int start, int n) {
        int len = nums.length;
        List<List<Integer>> res = new LinkedList<>();
        if(len < 2 || len < n) return res;
        if(n == 2){
            int left = start, right = len - 1;
            while(left < right){
                int sum = nums[left] + nums[right];
                int low = nums[left], high = nums[right];
                if(sum == target){
                    res.add(new LinkedList<>(Arrays.asList(nums[left],nums[right])));
                    while (left < right && nums[left] == low) left++;
                    while (left < right && nums[right] == high) high--;
                }else if(sum > target){
                    right--;
                }else if(sum < target){
                    left++;
                }
            }
            return res;
        }else {
            for(int i = start; i < len; i++){
                if(i - 1 >= start && nums[i] == nums[i - 1]) continue;
                List<List<Integer>> sub = nSum(nums, target - nums[i], i + 1, n - 1);
                for(List<Integer> arr : sub){
                    arr.add(nums[i]);
                    res.add(new LinkedList<>(arr));
                }
            }
            return res;
        }
    }

15. 三数之和

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        return nSum(nums, 0, 0, 3);
    }

    private List<List<Integer>> nSum(int[] nums, long target, int start, int n) {...}
}

18. 四数之和

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        return nSum(nums, target, 0, 4);
    }

    private List<List<Integer>> nSum(int[] nums, long target, int start, int n) {...}
}

参考资料

一个方法团灭 NSUM 问题

posted @ 2022-08-19 11:19  dotJunz  阅读(258)  评论(0编辑  收藏  举报