乘风破浪:LeetCode真题_018_4Sum

乘风破浪:LeetCode真题_018_4Sum

一、前言

    前面我们已经练习过了三个数相加的集合运算,现在变成了四个数,其实道理是一样的。三个数的时候可以转成两个数的加法,最后来解决,而四个数的可以转换成三个数的加法,最终变成两个数的加法运算。

二、4Sum

2.1 问题

2.2 分析与解决

    根据我们之前的经验,可以很自然地想到变成三个数相加来计算,不过因为是四个数相加,因此需要至少3个循环了,这样时间复杂度就是O(n~3)。下面是这种解法。

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> ans = new ArrayList<>();
        if (nums.length == 0) return ans;
        Arrays.sort(nums);
        for (int i = 0; i < nums.length - 3; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            for (int j = i + 1; j < nums.length - 2; j++) {
                if (j > i + 1 && nums[j] == nums[j - 1]) continue;
                int k = j + 1, l = nums.length - 1;
                while (k < l) {
                    int sum = nums[i] + nums[j] + nums[k] + nums[l];
                    if (sum < target) k++;
                    else if (sum > target) l--;
                    else {
                        List<Integer> list = new ArrayList<>();
                        list.add(nums[i]);
                        list.add(nums[j]);
                        list.add(nums[k]);
                        list.add(nums[l]);
                        ans.add(list);
                        if (nums[k] == nums[l]) break;
                        while (k + 1 < l && nums[k] == nums[k + 1]) k++;
                        while (l - 1 > k && nums[l] == nums[l - 1]) l--;
                        k++;
                        l--;
                    }
                }
            }
        }
        return ans;
    }
}

 

    另外我们也可以做一些细节上面优化,这里不再赘述。

三、总结

     对于一些类型题,我们只要理解了一些本质,并且在做题的时候多联想一些之前的道理,就能轻松地做出来了。万事开头难,思路是非常重要的。

posted @ 2019-01-03 19:22  精心出精品  阅读(204)  评论(0编辑  收藏  举报