🌕 18. 四数之和

吞佛童子2022年6月9日
  • algorithm
  • hash
小于 1 分钟

🌕 18. 四数之和

难度: 🌕

问题描述

img_19.png


解法

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        // 思路:
        // 固定 a 
        // 再固定 b
        // 此时 [c] + [d] == - ([a] + [b])
        int len = nums.length;
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        for(int i = 0; i <= len - 4; i ++) {
            // 去重 
            if(i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            for(int j = i + 1; j <= len - 3; j ++) {
                if(j > i + 1 && nums[j] == nums[j - 1]) {
                    continue;
                }
                int left = j + 1;
                int right = len - 1;
                int tar = target - (nums[i] + nums[j]);
                while(left < right) {
                    int sum = nums[left] + nums[right];
                    if(sum == tar) {
                        List<Integer> list = new ArrayList<>();
                        list.add(nums[i]);
                        list.add(nums[j]);
                        list.add(nums[left]);
                        list.add(nums[right]);
                        res.add(list);
                        // 去重
                        while(left + 1 < right && nums[left] == nums[left + 1]) {
                            left ++;
                        }
                        while(left < right - 1 && nums[right] == nums[right - 1]) {
                            right --;
                        }
                        left ++;
                    } else if(sum > tar) {
                        right --;
                    } else {
                        left ++;
                    }
                }
            }
        }
        return res;
    }
}

输出

img_18.png

上次编辑于: 2022/6/20 下午8:24:47
贡献者: liuxianzhishou