【算法 -- LeetCode】(018) 四数之和

news2024/11/26 20:33:38

在这里插入图片描述

1、题目

给你一个由 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

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

示例 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
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109

题目链接:https://leetcode.cn/problems/4sum

2、图解

使用两重循环分别枚举前两个数,然后在两重循环枚举到的数之后使用双指针枚举剩下的两个数。

假设两重循环枚举到的前两个数分别位于下标 i 和 j,其中 i < j 。初始时,左右指针分别指向下标 j + 1和下标 n - 1 。每次计算四个数的和,并进行如下操作:

  • 如果和等于 target,则将枚举到的四个数加到答案中,然后将左指针右移直到遇到不同的数,将右指针左移直到遇到不同的数;

  • 如果和小于 target,则将左指针右移一位;

  • 如果和大于 target,则将右指针左移一位。

使用双指针枚举剩下的两个数的时间复杂度是 O(n),因此总时间复杂度是 O(n3),低于 O(n4)。

具体实现时,还可以进行一些剪枝操作:

  • 在确定第一个数之后,如果
    nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target,说明此时剩下的三个数无论取什么值,四数之和一定大于 target,因此退出第一重循环;
  • 在确定第一个数之后,如果
    nums[i] + nums[n-3] + nums[n-2] + nums[n-1] < target,说明此时剩下的三个数无论取什么值,四数之和一定小于 target,因此第一重循环直接进入下一轮,枚举 nums[i + 1];
  • 在确定前两个数之后,如果
    nums[i] + nums[j] + nums[n-2] + nums[j+2] > target ,说明此时剩下的两个数无论取什么值,四数之和一定大于 target,因此退出第二重循环;
  • 在确定前两个数之后,如果
    nums[i] + nums[j] + nums[n-2] + nums[n-1] < target,说明此时剩下的两个数无论取什么值,四数之和一定小于 target
    ,因此第二重循环直接进入下一轮,枚举 nums[j + 1]。

注意:由于可能出现的溢出,对数据需要转换成long型。

3、Java 示例代码

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        if (nums == null || nums.length < 4) {
            return new ArrayList<>();
        }

        Arrays.sort(nums);
        int n = nums.length;
        List<List<Integer>> ans = new ArrayList<>();
        for (int first = 0; first < n - 3; first++) {
            if (first > 0 && nums[first] == nums[first - 1]) {
                continue;
            }

            // 部分用例溢出,改成target减去形式
            if (nums[first] + nums[first + 1] > target - nums[first + 3] - nums[first + 2]) {
                break;
            }

            // 部分用例溢出,改成target减去形式
            if (nums[first] + nums[n - 3] < target - nums[n - 1] - nums[n - 2]) {
                continue;
            }

            for (int second = first + 1; second < n - 2; second++) {
                if (second > first + 1 && nums[second] == nums[second - 1]) {
                    continue;
                }

                // 部分用例溢出,改成target减去形式
                if (nums[first] + nums[second] > target - nums[second + 2] - nums[second + 1]) {
                    break;
                }

                // 部分用例溢出,改成target减去形式
                if (nums[first] + nums[second] < target - nums[n - 1] - nums[n - 2]) {
                    continue;
                }

                int left = second + 1;
                int right = n - 1;
                while (left < right) {
                    // 防止溢出情况
                    long sum = (long) nums[first] + nums[second] + nums[left] + nums[right];
                    if (sum > target) {
                        right--;
                    } else if (sum < target) {
                        left++;
                    } else if (sum == target) {
                        ans.add(Arrays.asList(nums[first], nums[second], nums[left], nums[right]));
                        left++;
                        right--;
                        while (left < right && nums[left] == nums[left - 1]) {
                            left++;
                        }
                        while (left < right && nums[right] == nums[right + 1]) {
                            right--;
                        }
                    }
                }
            }
        }

        return ans;
    }
}

执行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/753484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Hadoop 01】简介

1 Hadoop 简介 Hadoop适合海量数据分布式存储和分布式计算 Hadoop 3.x的细节优化&#xff1a; Java改为支持8及以上HDFS支持纠删码HDFS支持多NameNodeMR任务级本地优化多重服务默认端口变更 Hadoop主要包含三大组件&#xff1a;HDFSMapReduceYARN HDFS负责海量数据的分布式存…

HttpRunner自动化之跨文件传递变量值输出变量值

跨文件传递&输出变量值 output: 输出变量值,此参数在httprunner2.2版本的时候被 export 代替&#xff0c;跨文件传递参数的功能在httprunner2.2之后不生效。&#xff08;但是实际测试过程中&#xff0c;还可以使用跨文件功能&#xff09; export: 输出变量值,且可以跨文件…

(黑客)网络安全靠自学?你不要命啦?

引言⚡ ✈️网络安全&#xff0c;顾名思义&#xff0c;无安全&#xff0c;不网络。现如今&#xff0c;安全行业飞速发展&#xff0c;我们呼吁专业化的 就职人员 与 大学生 &#xff0c;而你&#xff0c;认为自己有资格当黑客吗&#xff1f; ✒️本文面向所有信息安全领域的初学…

2023-07-14:讲一讲Kafka与RocketMQ中存储设计的异同?

2023-07-14&#xff1a;讲一讲Kafka与RocketMQ中存储设计的异同&#xff1f; 答案2023-07-14&#xff1a; 在Kafka中&#xff0c;文件的布局采用了Topic/Partition的方式&#xff0c;每个分区对应一个物理文件夹&#xff0c;且在分区文件级别上实现了顺序写入。然而&#xff0…

springboot逍遥大药房管理系统

逍遥大药房管理系统的需求和管理上的不断提升&#xff0c;逍遥大药房管理的潜力将无限扩大&#xff0c;逍遥大药房管理系统在现代社会上被广泛关注&#xff0c;本系统对此进行总体分析&#xff0c;将逍遥大药房信息管理的发展提供参考。逍遥大药房管理系统对逍遥大药房管理方面…

xxl-job的简单使用

xxl-job是一个分布式任务调度框架&#xff0c;在Spring中&#xff0c;提供有任务调度的注解功能&#xff0c;在之前的项目中&#xff0c;非分布式任务都可以直接使用Spring框架提供的Scheduled注解和EnableScheduling注解来实现定时任务。 EnableScheduling注解加载项目启动类上…

Azure Kinect DK 在设备管理器找不到此设备

参考 Azure Kinect DK 在设备管理器找不到此设备_Thomas_yx的博客-CSDN博客 type-c------------------type-c 接电脑&#xff0c;数据传输 圆------------------usb 电脑线

RabbitMQ ---- 交换机

RabbitMQ ---- 交换机 1. Exchanges1.1 Exchanges 概念1.2 Exchanges 的类型1.3 无名 exchange 2. 临时队列3. 绑定&#xff08;bindings&#xff09;4. Fanout4.1 Fanout 介绍4.2 Fanout 实战 5. Direct exchange5.1 回顾5.2 Direct exchange 介绍5.3 多重绑定5.4 实战 6. Top…

svn清理时提示:没有校验和记录,因此不能从原始内容仓库中安装

1.进入官网 https://www.sqlite.org/download.html 2.找到sqlite-dll-win32-x86-3410200.zip下载 3.解压后复制sqlite3.exe到无法清理svn的那个路径地下的.svn文件夹 如果找不到.svn文件夹&#xff0c;勾选下方 4.在当前文件夹下运行cmd执行以下语句 sqlite3 wc.db &quo…

基于Python情感分析制定交易策略

大家好&#xff0c;在快速发展的金融市场环境中&#xff0c;交易者不断寻找创新的方法来获得竞争优势。情感分析已经成为一种有价值的工具&#xff0c;通过分析文本数据&#xff0c;如新闻文章和社交媒体帖子等&#xff0c;来衡量市场情绪。 通过将情感分析纳入到交易策略中&a…

使用wxPython和pillow开发拼图小游戏(四)

上一篇介绍了使用本地图片来初始化游戏的方法&#xff0c;通过前边三篇&#xff0c;该小游戏的主要内容差不多介绍完了&#xff0c;最后这一篇来介绍下游戏用时的计算、重置游戏和关闭窗口事件处理 游戏用时的计算 对于游戏用时的记录&#xff0c;看过前几篇的小伙伴可能也发现…

MS6363三通道 6 阶高清视频滤波驱动

芯片概述 MS6363 是一个 3 通道视频缓冲器&#xff0c;它内部集成 6dB 增益的轨到轨输出驱动器和 6 阶输出重建 滤波器。MS6363 的-3dB 带宽为 35MHz&#xff0c;压摆率为 160V/us。MS6363 比无源 LC 滤波器与外加驱动的 解决方案能提供更好的图像质量。它单电源供电范围为2…

2023年11月软考中级软件评测师报名考试时间-入口-条件-流程

软考中级软件评测师报名时间&#xff1a; 海南2023下半年软考中级软件评测师报名时间&#xff1a;8月14日至8月21日 四川2023下半年软考中级软件评测师报名时间&#xff1a;8月14日至8月30日 黑龙江2023下半年软考中级软件评测师报名时间&#xff1a;8月16日至8月22日 广西…

【PDF】html/dom生成pdf

1、简要描述 上一篇博客主要讲的是pdf文件转换成canvas&#xff0c;然后进行相关的操作。本篇博客主要讲html中dom如何生成pdf文件&#xff08;前端生成pdf&#xff09;&#xff0c;后端生成pdf当然也可以&#xff0c;原理也是将html网页通过后端服务导出成pdf&#xff0c;不深…

LaTex使用bib文件引用参考文献(最简单有效!!!)

引言 在写文章&#xff0c;尤其是科技类文章的时候&#xff0c;需要引用大量参考文献。如果按照本身给的模板一个个填入是十分浪费时间的&#xff0c;并且后面引用格式或者顺序有改变的话改动很大。所以我一般习惯于用Bib文件直接导入&#xff0c;接下来就是介绍使用Bib文件导…

密码学学习笔记(十一):压缩函数 - Davies–Meyer结构

密码学中压缩函数是指将输入的任意长度消息压缩为固定长度输出的函数。压缩函数以两个特定长度的数据为输入&#xff0c;产生与其中一个输入大小相同的输出。简单来说就是它接受一些较长的数据&#xff0c;输出更短的数据。 压缩函数接收长度为X和Y的两个不同输入&#xff0c;并…

如何退出telnet

例如&#xff0c;我已经成功telnet到服务器了&#xff0c;可以输入信息&#xff1a; 此时&#xff0c;同时按 ctrl 和 ] 键&#xff0c;可以到telnet提示符窗口&#xff0c;如下&#xff1a; 在telent提示符窗口&#xff0c;输入quit&#xff0c;然后回车&#xff0c;就回到了…

性能测试的一二三

目录 前言&#xff1a; 性能测试流程 性能工具 如何选择性能测试工具 性能测试需要掌握哪些技能 总结 前言&#xff1a; 性能测试是评估系统在不同负载条件下的性能和稳定性的过程。 在我们日常生活和工作中&#xff0c;软件已经成为不可或缺的一部分。然而&#xff0c;…

高并发的哲学原理(五)-- 拆分网络单点(上):应用网关、负载均衡和路由器(网关)

上一篇文章的末尾&#xff0c;我们提到了一个假想出来的五万 QPS 的系统&#xff0c;以及这种规模的系统架构中必然存在的负载均衡器&#xff0c;那本篇文章我们就来一起利用负载均衡搭建一个能够支撑五万 QPS 的系统。 “监听 HTTPS 443 端口的进程”这个单点 之前&#xff0…

Linux DMA 简介

文章目录 1. 前言2. 背景3. DMA 硬件基础3.1 什么是 DMA&#xff1f;3.2 为什么需要 DMA&#xff1f;3.3 DMA 传送模式3.4 DMA 常见硬件拓扑3.4.1 ARM 架构常见 DMA 硬件拓扑3.4.2 其它架构 DMA 硬件拓扑 4. Linux 下的 DMA4.1 DMA 内存地址和区域4.1.1 DMA 内存涉及的3种地址4…