LeetCode 18. 4Sum

LeetCode 18. 4Sum (四数之和)

题目

链接

https://leetcode-cn.com/problems/4sum/

问题描述

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

示例

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

提示

1 <= nums.length <= 200
-109 <= nums[i] <= 109
-109 <= target <= 109

思路

和三数之和一个思路,前两个采用循环,第三四个采用双指针。

复杂度分析

时间复杂度 O(n3)
空间复杂度 O(n)

代码

Java

    public List<List<Integer>> fourSum(int[] nums, int target) {
        HashSet<List<Integer>> all = new HashSet<>();
        ArrayList<List<Integer>> ans = new ArrayList<>();
        Arrays.sort(nums);
        int n = nums.length;

        if (n < 4) {
            return ans;
        }
        for (int i = 0; i < n - 3; i++) {
            for (int j = i + 1; j < n - 2; j++) {
                int sum = nums[i] + nums[j];
                int left = j + 1;
                int right = n - 1;
                while (left < right) {
                    int tmpsum = sum + nums[left] + nums[right];
                    if (tmpsum == target) {
                        List<Integer> tmp = new ArrayList<>();
                        tmp.add(nums[i]);
                        tmp.add(nums[j]);
                        tmp.add(nums[left++]);
                        tmp.add(nums[right--]);
                        tmp.sort(new Comparator<Integer>() {
                            @Override
                            public int compare(Integer o1, Integer o2) {
                                return o1 - o2;
                            }
                        });
                        all.add(tmp);
                    } else if (tmpsum < target) {
                        left++;
                    } else {
                        right--;
                    }
                }
            }

        }
        Iterator<List<Integer>> iterator = all.iterator();
        while (iterator.hasNext()) {
            ans.add(iterator.next());
        }
        return ans;
    }
posted @ 2022-04-24 17:43  cheng102e  阅读(15)  评论(0编辑  收藏  举报