【LeetCode·中等】 18.四数之和(4sum)

题目描述

英文版描述

Given an array nums of n integers, return an array of all the unique quadruplets [nums[a], nums[b], nums[c], nums[d]] such that:

  • 0 <= a, b, c, d < n
  • a, b, c, and d are distinct.
  • nums[a] + nums[b] + nums[c] + nums[d] == target

You may return the answer in any order.

Example 1:

Input: nums = 1,0,-1,0,-2,2, target = 0

Output: \[-2,-1,1,2,-2,0,0,2,-1,0,0,1]

Example 2:

Input: nums = 2,2,2,2,2, target = 8

Output: \[2,2,2,2]

Constraints:

  • 1 <= nums.length <= 200
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= target <= 10^9

英文版地址

leetcode.com/problems/4s...

中文版描述

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

  • 0 <= a, b, c, d < n
  • abcd 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

示例 1:

输入: nums = 1,0,-1,0,-2,2, target = 0

输出: \[-2,-1,1,2,-2,0,0,2,-1,0,0,1]

示例 2:

输入: nums = 2,2,2,2,2, target = 8

输出: \[2,2,2,2]

提示:

  • 1 <= nums.length <= 200
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= target <= 10^9

中文版地址

leetcode.cn/problems/4s...

解题方法

ini 复制代码
class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        if (nums == null || nums.length < 4) {
            return new LinkedList<>();
        }
        List<List<Integer>> result = new LinkedList<>();
        Arrays.sort(nums);
    
        for (int i = 0; i <= nums.length - 4; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            if ((long) nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) {
                break;
            }
            for (int j = i + 1; j <= nums.length - 3; j++) {
                if (j > i + 1 && nums[j] == nums[j - 1]) {
                    continue;
                }
                if ((long) nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target) {
                    break;
                }
                int left = j + 1;
                int right = nums.length - 1;
                while (left < right) {
                    long re = nums[i] + nums[j] + nums[left] + nums[right];
                    if (re == target) {
                        List<Integer> sub = new LinkedList<>();
                        sub.add(nums[i]);
                        sub.add(nums[j]);
                        sub.add(nums[left]);
                        sub.add(nums[right]);
                        result.add(sub);
                         left++;
                        while (left < right && nums[left] == nums[left - 1]) {
                            left++;
                        }
                        right--;
                        while (left < right && nums[right] == nums[right + 1]) {
                            right--;
                        }
                 
                    } else if (re < target) {
                        left++;
                    } else if (re > target) {
                        right--;
                    }

                }
            }

        }
        return result;
    }
}

复杂度分析

  • 时间复杂度:O(n^3),其中 n 是数组的长度。排序的时间复杂度是 O(nlog⁡n),枚举四元组的时间复杂度是 O(n^3),因此总时间复杂度为 O(n^3+nlog⁡n)=O(n^3)
  • 空间复杂度:O(log⁡n),n 是数组的长度。空间复杂度主要取决于排序额外使用的空间。此外排序修改了输入数组 nums,实际情况中不一定允许,因此也可以看成使用了一个额外的数组存储了数组 nums 的副本并排序。
相关推荐
苏三说技术4 小时前
Claude Code从失控到起飞,只用了这些技巧
后端
长栎5 小时前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode5 小时前
Redis 在生产项目的使用
前端·后端
用户559822481225 小时前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode5 小时前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战5 小时前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha6 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn6 小时前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户762352425916 小时前
ShardingJDBC
后端
行者全栈架构师6 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端