leetcode 18. 四数之和(优质解法)

代码:

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> lists=new ArrayList<>();int length=nums.length;Arrays.sort(nums);for(int i=0;i<=length-4;){for(int j=i+1;j<=length-3;){//先固定两个数,再采用双指针和利用有序数组单调性来找到符合条件的另外两个数//加减操作很可能会溢出,所以最好用 long 类型long LRTarget=(long) target-nums[i]-nums[j];int left=j+1;int right=length-1;while (left<right){long newLR=nums[left]+nums[right];if(newLR<LRTarget){left++;}else if(newLR>LRTarget){right--;}else {//符合条件,记录当前的 nums[i],nums[j],nums[left],nums[right]lists.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));left++;right--;//去重操作//一般在容器中进行死循环移动都要考虑边界问题while (left<right&&nums[left]==nums[left-1]){left++;}while (left<right&&nums[right]==nums[right+1]){right--;}}}//当前固定的 num[j] 的所有情况都找到了j++;while (j<=length-3&&nums[j]==nums[j-1]){j++;}}//当前固定的 num[i] 的所有情况都找到了i++;while (i<=length-4&&nums[i]==nums[i-1]){i++;}}return lists;}
}

题解:

        我们要在数组中选出相加为 0 的三个数,要选出符合条件的多个数,我们可以尝试采用先排序,利用有序数组的单调性和双指针的方式解决

        四数之和的求解方法和三数之和几乎一样,只是多了一个固定的数而已,推荐先看leetcode 15. 三数之和(优质解法)

          首先对于示例 ,-1,-1,3,0,5,-1,3,0, target = 1 经过排序以后得到 -1.-1,-1,0,0,3.,3,5由于此时我们要获取 4 个数,而采用双指针的方式只能探讨两个数的选择,所以我们可以先固定两个数,先用指针 i 指向要固定的数 -1,指针 j 指向要固定的数 -1,此时我们只需要在 j 右边的区间内找到两个数,使 nums[ L ] + nums[ R ]= target - nums[ i ] - nums[ j ] 即可,此时 nums[ L ] + nums[ R ]=1-(-1)-(-1)=3

        如下图,让指针 L 指向右边区间最小的数,指针 R 指向右边区间最大的数,此时 nums[ L ] + nums[ R ] = -1+5 = 4 > 3, 就需要取的两数之和小一点,此时 L 指针已经是区间中最小的了,所以需要淘汰大的数 5, R - -

-1        -1        -1        0        0        3        3        5

 i           j          L                                                R

        此时 nums[ L ] + nums[ R ] = -1+3=2 < 3 ,就需要取的两数之和大一点,此时 R 指针已经是区间中最大的了,所以需要淘汰小的数 -1,L++

-1        -1        -1        0        0        3        3        5

 i           j          L                                      R

         此时 nums[ L ] + nums[ R ] = 0+3=3 == 3,符合条件,就记录当前 nums[ i ] , nums[ j ] ,nums[ L ] ,nums[ R ] 的值,由于需要找出所有的情况,所以现在还不能停止,让 L++,R- -,继续寻找符合条件的数据

-1        -1        -1        0        0        3        3        5

 i           j                    L                            R

        题目中有要求,要去除重复的数据,当我们排序以后相同的数据都会靠在一起,我们上一轮已经将 nums[ L ] 为 0 的值获取了,此时 nums[ L ] 依然为 0,即使有符合条件的 nums[ R ] 也是重复的要排除掉,所以当 nums[ L ] == nums[ L-1 ] 时,就直接 L ++ 跳过(在跳过时要注意边界问题),对于 R 指针也是一样的处理,当 nums[ R ] == nums[ R+1 ] 时,就直接 R- - 跳过

-1        -1        -1        0        0        3        3        5

 i           j                              L        R        

        当 L == R 时就说明当前固定的 nums[ j ] 的情况已经全部发现了,就需要 j++,但其中也涉及到数据重复的问题,j ++ 以后指向的值依然为 -1 ,代表要在右边的区间寻找两个和为 3 的数,但之前已经寻找过了,现在再找一遍也只会找到同样的数据,所以当 nums[ j ] == nums[ j+1 ] 时就直接 j++ 跳过,对于下标 i 也一样,当nums[ i ] == nums[ i+1 ] 时就直接 i++ 跳过

-1        -1        -1        0        0        3        3        5

 i                      j                            R        

                                                      L         

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

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

相关文章

第十五届蓝桥杯(Web 应用开发)模拟赛 2 期-大学组(详细分析解答)

目录 1.相不相等 1.1 题目要求 1.2 题目分析 1.3 源代码 2.三行情书 2.1 题目要求 2.2 题目分析 2.3 源代码 3.电影院在线订票 3.1 题目要求 3.2 题目分析 3.3 源代码 4.老虎坤&#xff08;不然违规发不出来&#xff09; 4.1 题目要求 4.2 题目分析 4.3 源代码 …

宝塔环境备份到西部数码FSS

1、登陆宝塔面板-软件商店-第三方应用&#xff0c; 搜索ftp&#xff1a;找到FTP存储空间&#xff0c;点击安装 2、在软件商城-已安装&#xff0c;找到ftp存储空间&#xff0c;点击进入选项设置. 3、按照下图填写fss相关参数.这些信息可以在fss详情中查看.目录路径如果没有请先在…

CSS伪类伪元素?:hover,::before,::after使用(举例)

文章目录 什么是CSS伪类&#xff1f;什么是伪元素&#xff1f;怎么用伪元素&#xff1f;可以做些什么&#xff1f;::before&#xff0c;在标签选择器之前添加内容&#xff0c;::after正好与之相反::before&#xff0c;在类选择器之前添加内容&#xff08;:制作一个悬浮提示窗 参…

ROM和RAM概念

一、存储器特性 1&#xff09;易失性&#xff1a;掉电数据会丢失&#xff0c;通常指RAM&#xff1b; RAM分为SRAM、DRAM SRAM&#xff1a;静态RAM&#xff0c;只要上电数据就不会丢失&#xff1b; DRAM&#xff1a;动态RAM&#xff0c;需要每隔一段事件刷新数据&#xff0c;否…

宽量程双计数器测量方法

如要测量计数器信号的数字频率或周期&#xff0c;可使用双计数器方法测量宽量程信号。该方法适于待测量信号的范围较广且整个范围都需要较高测量精度的情况。关于使用宽量程测量方法提高测量精度的详细信息&#xff0c;见量化误差章节。也可使用该方法测量比计数器时基频率更高…

linux磁盘已满,查看哪个文件占用多

使用df -h查看磁盘空间占用情况 使用sudo du -s -h /* | sort -nr命令查看那个目录占用空间大 然后那个目录占用多 再通过sudo du -s -h /var/* | sort -nr 一层层排查&#xff0c;找到占用文件多的地方 如果通过以上方法没有找到问题所在&#xff0c;那么可以使用 lsof |…

UI自动化测试工具工作原理是怎样的?

随着软件开发的不断演进&#xff0c;保障软件质量成为了至关重要的一环。在这个过程中&#xff0c;UI自动化测试工具崭露头角&#xff0c;为开发团队提供了一种强有力的方式来确保应用程序的稳定性、功能性和兼容性。本文将深入探讨UI自动化测试工具的定义、工作原理以及其在提…

mybatis数据输入-零散的简单类型数据

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…

版本控制系统Git学习笔记-Git基本知识介绍

目录 前言一、版本控制系统1.1 什么是版本控制系统1.2 本地版本控制系统1.3 集中化的版本控制系统1.3 分布式版本控制系统 二、Git简介2.1 数据处理方式2.2 几个特点2.2.1 几乎所有操作都是本地执行2.2.2 Git保证完整性2.2.3 Git一般只添加数据 2.3 Git中文件状态2.3.1 三种文件…

拼图游戏制作

2.创建用户界面 package domain; /** * ClassName: User * Author: Kox * Data: 2023/2/2 * Sketch: */ public class User { private String username; private String password; public User() { } public User(String username, String p…

防火墙之iptables

iptables概述 1.Linux 系统的防火墙 &#xff1a;IP信息包过滤系统&#xff0c;它实际上由两个组件netfilter 和 iptables组成。 2.主要工作在网络层&#xff0c;针对IP数据包。体现在对包内的IP地址、端口、协议等信息的处理上。 -netfilter/iptables关系&#xff1a; netfil…

JS获取字符串里最长的回文字符串

方法一 使用双指针配合枚举 /*** param {string} s* return {string}*/ const longestPalindrome s > {const LEN s.lengthif (LEN < 2) {return s}let maxStr /*** param left * param right * returns */const findPalindrome (left, right) > {while (left &…

day32_Git

今日内容 零、 复习昨日 零、 复习昨日 一、引言 在单人开发过程中&#xff0c;需要进行版本管理&#xff0c;以利于开发进度的控制。 在多人开发过程中&#xff0c;不仅需要版本管理&#xff0c;还需要进行多人协同控制。 版本控制(VS) SVN GIT 二、介绍 Git是一个开源的…

rabbitmq-server-3.11.10.exe

rabbitmq需要erlang环境 otp_win64_25.1.exe erlang-CSDN博客 https://www.rabbitmq.com/download.htmlhttps://www.rabbitmq.com/install-windows.htmlhttps://github.com/rabbitmq/rabbitmq-server/releases/download/v3.11.10/rabbitmq-server-3.11.10.exe C:\Users\Admi…

Spine深入学习 —— 换装

Spine深入学习————换装 数据对象和实例对象的关系与区别 数据对象是无状态的&#xff0c;可在任意数量的骨架实例间共用。有对应实例数据的数据对象类名称以“Data”结尾&#xff0c;没有对应实例数据的数据对象则没有后缀&#xff0c;如附件、皮肤及动画。 实例对象有许…

【数据结构】——排序

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

bugku题解记录2

文章目录 哥哥的秘密黄道十二官where is flag一段新闻 哥哥的秘密 给出了一个qq&#xff0c;那就去看看呗 hint里面说 收集空间信息——相册——收集微博信息——相册——解题——相册——提交flag 那看看空间先 盲文&#xff1a; hint&#xff1a;密码时地人 旗帜存在相册里…

【精选】ATKCK红队评估实战靶场一 超详细过程思路

一、环境搭建 1.红日靶场下载&#xff1a; 靶场下载地址&#xff1a; https://pan.baidu.com/s/1nC6V8e_EuKfaLb2IuEbe7w&shflsharepset 提取码&#xff1a;n1u22.内外网IP搭建 Windows 7 x64Windows Server 2008Win2K3 Metasploitablekali内网IP&#xff1a;192.168.52…

【LeetCode:1657. 确定两个字符串是否接近 | 计数 + 阅读理解】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Ubuntu使用Nginx部署前端项目——记录

安装nginx 依次执行以下两条命令进行安装&#xff1a; sudo apt-get update sudo apt-get install nginx通过查看版本号查看是否安装成功&#xff1a; nginx -v补充卸载操作&#xff1a; sudo apt-get remove nginx nginx-common sudo apt-get purge nginx nginx-common su…