Loading

18. [双指针]四数之和

18. 四数之和

下面是可稍作修改就应用于 15. 三数之和 的模板。

//执行耗时:28 ms,击败了18.19% 的Java用户 
//内存消耗:38.9 MB,击败了91.90% 的Java用户

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);  // 排序
        int n = nums.length;


        List<List<Integer>> res = new ArrayList<List<Integer>>();

        for (int a = 0; a < n - 3; a++){
            // 防止a重复
            if (a > 0 && nums[a] == nums[a - 1]){
                continue;
            }
            for (int b = a + 1; b < n - 2; b++){
                // 防止b重复
                if (b > a + 1 && nums[b] == nums[b-1]){
                    continue;
                }
                int left = b + 1, right = n - 1;
                while (left < right){
                    int sum = nums[a] + nums[b] + nums[left] + nums[right];
                    if (sum < target){
                        while (left < right && nums[left] == nums[++left]);
                    } else if (sum > target){
                        while (left < right && nums[right] == nums[--right]);
                    } else {
                        List<Integer> list = Arrays.stream(new int[] {nums[a],nums[b],nums[left],nums[right]}).boxed().collect(Collectors.toList());
                        res.add(list);
                        while (left < right && nums[left] == nums[++left]);
                        while (left < right && nums[right] == nums[--right]);
                    }
                }
            }
        }
        return res;
    }
}
posted @ 2020-10-24 10:44  上海井盖王  阅读(76)  评论(0)    收藏  举报