Java【手撕双指针】LeetCode 18. “四数之和“, 图文详解思路分析 + 代码

news2024/11/23 3:04:53

文章目录

  • 前言
  • 一、四数之和
    • 1, 题目
    • 2, 思路分析
    • 3, 代码


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

一、四数之和

1, 题目

OJ链接

这题是在"三数之和"的基础上进行了一些提升, 而"三数之和"又是在两数之和的基础上的提升, 核心算法思想是一致的, 不熟悉 “两数之和” 这道题的小伙伴建议看一下 这篇文章 , 不熟悉 “三数之和” 这道题的小伙伴建议看一下 这篇文章 , 弄懂了前两道题, 做出本题会非常轻松


2, 思路分析

最简单的暴力枚举 : 四层 for 循环, 从先固定一个数, 在剩余区间上固定一个数, 再在剩余区间上固定一个数, 暴力枚举依次找第四个数, 判断这四个数的和是否为 0 (目标值), 时间复杂度为O(N⁴), 必然会超出时间限制

  1. 先对数组排序(有序后使用对撞双指针可以大大提高效率)
  2. 使用 k 指针先固定一个数
  3. 剩余区间上使用 “三数之和” 的解法找到另外三个数
    在这里插入图片描述

固定住 k 时, 三数之和的总和定义为 threeTarget = target - nums[k],
固定住 i 时, 两数之和的总和定义为 twoTarget = threeTarget - nums[i]
总之就是, 四数之和中基本可以复用三数之和的代码, 而三数之和中又复用了两数之和的代码

三数之和中, 需要对 i, left, right 去重, 本题多了一个对 k 的去重, 去重方式和 i 的去重方式一致

在这里插入图片描述

当 k 指向 0 下标, i 指向 1 下标时, left 和 right 指针已经在剩余区间上遍历完了所有四元组, 接下来 k 不要着急自增, 因为 i 还没有遍历完(三数之和还没有执行完), 应该让 i 自增, left 回到 i + 1 位置开始, 继续执行未完成的"三数之和"

后续流程就不再赘述了, 就是把三数之和的代码放在 k 的循环之中, 稍作修改即可


3, 代码

	public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> list = new ArrayList<>();
        Arrays.sort(nums);
        int k = 0;
        // k 的循环
        while(k < nums.length - 3){
            long threeTarget = target - nums[k];
            int i = k + 1;
            // i 在剩余区间上执行"三数之和"
            while(i < nums.length - 2) {
                long twoTarget = threeTarget - nums[i];
                int left = i + 1;
                int right = nums.length - 1;
                // left 和 right 在剩余区间上执行"两数之和"(对撞双指针)
                while(left < right) {
                    List<Integer> inList = new ArrayList<>();
                    if(nums[left] + nums[right] > twoTarget) {
                        right--;
                    }else if(nums[left] + nums[right] < twoTarget) {
                        left++;
                    }else {
                    	// left 和 right 的去重
                        while(left < right && nums[right] == nums[right - 1]) {
                            right--;
                        }
                        while(left < right && nums[left] == nums[left + 1]){
                            left++;
                        }
                        inList.add(nums[k]);
                        inList.add(nums[i]);
                        inList.add(nums[left]);
                        inList.add(nums[right]);
                        list.add(inList);
                        left++;
                        right--;
                    }
                }
                // i 的去重
                i++;
                while(nums[i] == nums[i - 1] && i < nums.length - 2) {
                    i++;
                }
            }
            // k 的去重
            k++;
            while(nums[k] == nums[k - 1] && k < nums.length - 3) {
                k++;
            }
        }
        return list;
    }

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

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

相关文章

C# Emgu.CV 条码检测

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Emgu.CV; using Emgu.CV.Util; using static Emgu.C…

ThinkPHP 资源路由的简单使用,restfull风格API

ThinkPHP 资源路由的简单使用&#xff0c;restfull风格API 一、资源控制器二、资源控制器简单使用 一、资源控制器 资源控制器可以轻松的创建RESTFul资源控制器&#xff0c;可以通过命令行生成需要的资源控制器&#xff0c;例如生成index应用的TestR资源控制器使用&#xff1a…

layoutdm:discrete diffusion model for controllable layout generation

自动布局生成是我之前做banner生成中非常重要的一步&#xff0c;好的布局是成功的一半&#xff0c;在19年之前甚至更早时间&#xff0c;我们做这块主要是对标阿里的鹿班&#xff0c;那时候的技术方案主要是我之前发的smartbanner中&#xff0c;基本还是要靠模板以及相应的pipel…

软考A计划-网络工程师-必考知识点-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

[C/C++]笔记-函数的栈空间(避免栈空间溢出)

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…

机器视觉工程师们,人生而不平等,你更要迈出第一步的勇气

我永远相信人生而不公平&#xff0c;所以你必须跨出第一步。 有些事情试试才知道&#xff0c;每一个人每件事对待每一个人都是公平公正的。 很多小白&#xff0c;做事情总有一种胆怯的心理&#xff0c;我给一句忠告&#xff0c;先干再说&#xff0c;一边干&#xff0c;一边思考…

基于加密接口的测试用例设计

这里写目录标题 一、环境准备二、原理三、实战练习 一、环境准备 1、对响应加密的接口。对它发起一个get请求后&#xff0c;得到一个加密过后的响应信息。(如果有可用的加密过的接口以及了解它的解密方法&#xff0c;可以跳过) 2、准备一个加密文件 加密字段 3、使用python…

Java【手撕双指针】LeetCode 15. “三数之和“, 图文详解思路分析 + 代码

文章目录 前言一、三数之和1, 题目2, 思路分析3, 代码 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 &#x1f4d7; Java数据结构: 顺序表, 链表, 堆…

【base64】JavaScriptuniapp 将图片转为base64并展示

Base64是一种用于编码二进制数据的方法&#xff0c;它将二进制数据转换为文本字符串。它的主要目的是在网络传输或存储过程中&#xff0c;通过将二进制数据转换为可打印字符的形式进行传输 JavaScript 压缩图片 <html><body><script src"https://code.j…

Python绘图系统10:在父组件中使用子组件的函数

文章目录 Combobox绑定事件互相调用源代码 Python绘图系统&#xff1a; &#x1f4c8;从0开始实现一个三维绘图系统自定义控件&#xff1a;坐标设置控件&#x1f4c9;坐标列表控件&#x1f4c9;支持多组数据的绘图系统图表类型和风格&#xff1a;散点图和条形图&#x1f4ca;混…

【2023】数字信号处理之Fourier分析

目录 一、基础概念 1. 时域 2. 频域 3. Fourier分析级数变换 Fourier级数 Fourier变换 离散谱 连续谱 4. 欧拉公式&#xff01;&#xff01;&#xff01; 欧拉恒等式 二 、三角函数系及Fourier级数 1. 三角函数系 概念 性质——周期性、正交性、完备性 Fourier系…

AI时代,程序员需要焦虑吗?

原文来自 微信公众号"互联网技术人进阶之路". 目录 前言一、程序员会被 AI 取代么&#xff1f;二、服务端开发尚难被 AI 取代三、服务端开发何去何从&#xff1f;四、业界首部体系化、全景式解读服务端开发的著作第一部分&#xff1a;服务端开发的技术和方法第二部分…

java基于SpringBoot+vue的宠物用品商城交易平台的设计与实现y704t

在此基础上&#xff0c;结合现有宠物用品交易体系的特点&#xff0c;运用新技术&#xff0c;构建了以 springboot为基础的宠物用品交易信息化管理体系。首先&#xff0c;以需求为依据&#xff0c;根据需求分析结果进行了系统的设计&#xff0c;并将其划分为管理员和用户二种角色…

MySQL索引 事物 存储引擎

一 索引 索引的概念 索引就是一种帮助系统能够更快速的查找信息的结构 索引的作用 索引的副作用 创建索引的规则 MySQL的优化 哪些字段/场景适合创建索引 哪些不适合 小字段唯一性强的字段更新不频繁&#xff0c;但查询率比较高的字段表记录超过 300行主键&#xff0c;外键…

基于硬件隔离增强risc-v调试安全1_问题描述

安全之安全(security)博客目录导读 2023 RISC-V中国峰会 安全相关议题汇总 说明&#xff1a;本文参考RISC-V 2023中国峰会如下议题&#xff0c;版权归原作者所有。

6个最受欢迎的3D点云查看工具【在线/离线】

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 免费3D点云软件有点像寻找大脚怪… 性质神秘。 模糊的目击。 有些人甚至认为这是民间传说。 但令人惊讶的是&#xff0c;免费的3D点云软件确实存在。 与大脚野人不同的是&#xff0c;我们已经证明了它的存在。 本文将介…

【启扬方案】基于i.MX8M Mini 核心板的工业数据采集与控制系统解决方案

随着通信和网络技术的飞速发展以及互联网的普及&#xff0c;工业管理已经趋向数据化、网络化和智能化。在智慧工厂中&#xff0c;利用工业物联网实现工业数据采集和控制已经成为必不可少的一部分。 传统的工业数据采集和控制系统通常需要连接多个数据采集设备进行高速通信&…

入门vue——创建vue脚手架项目 以及 用tomcat和nginx分别部署vue项目(vue2)

入门vue——创建vue脚手架项目 以及 用tomcat和nginx分别部署vue项目&#xff08;vue2&#xff09; 1. 安装npm2. 安装 Vue CLI3. 创建 vue_demo1 项目&#xff08;官网&#xff09;3.1 创建 vue_demo1 项目3.1.1 创建项目3.1.2 解决 sudo 问题 3.2 查看创建的 vue_demo1 项目3…

美芯再失一大市场,国产车机芯片大突破,高通不再是唯一选择

日前知名评测软件给出的数据指出国内车机芯片市场&#xff0c;国产车机芯片已取得重大进展&#xff0c;性能方面已与车机芯片龙头高通的上一代接近&#xff0c;只有高通最新的车机芯片才取得领先优势&#xff0c;显示出国产芯片取得重大突破。 汽车芯片已是芯片行业的重要增长点…

备份迁移数据库

记录下备份迁移数据库的经历。 使用工具sqldump和mysql 1、sqldump导出数据 #导出整个数据库 sudo mysqldump -uroot -p123456 database > database.sql#导出数据库中某个表 sudo mysqldump -uroot -p123456 database table1 > database.sql#导出数据库中多个表 sudo …