3-哈希表-71-三数之和-LeetCode15

3-哈希表-71-三数之和-LeetCode15

参考:代码随想录

LeetCode: 题目序号15

更多内容欢迎关注我(持续更新中,欢迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

技术公众号:CodeZeng1998(纯纯技术文)

生活公众号:好锅(Life is more than code)

CSDN: CodeZeng1998

其他平台:CodeZeng1998好锅

15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

**注意:**答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:

  • 3 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

关键内容:

  • 答案中不可以包含重复的三元组
    /**
     * 三数之和(双指针)
     *
     * @param nums 目标数组
     * @return 不可以包含重复的三元组
     * @author CodeZeng1998
     */
    public List<List<Integer>> threeSum(int[] nums) {

        List<List<Integer>> result = new ArrayList<>();
        // 数组升序排序
        Arrays.sort(nums);

        for (int i = 0; i < nums.length; i++) {
            // 数组是升序排序,第一个数大于0,就说明后序都没有满足条件的数据了
            if (nums[i] > 0) {
                return result;
            }

            // 题目要求不可以包含重复的三元组,所以需要去重,如果当前数和前一个数相等,就跳过本次循环
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }

            int left = i + 1;
            int right = nums.length - 1;

            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];

                if (sum > 0) {
                    right--;
                } else if (sum < 0) {
                    left++;
                } else {
                    result.add(Arrays.asList(nums[i], nums[left], nums[right]));

                    // 去重
                    while (left < right && nums[left] == nums[left + 1]) {
                        left++;
                    }

                    // 去重
                    while (left < right && nums[right] == nums[right - 1]) {
                        right--;
                    }
                    left++;
                    right--;
                }
            }
        }
        return result;
    }

ChatGPT:

该代码的功能是找到一个整数数组 nums 中所有和为零且不重复的三元组。通过排序和双指针技术,代码能够高效地找到符合条件的三元组。

1. 初始化和排序: 首先,代码初始化了一个空的列表 result,用于存储所有找到的符合条件的三元组。然后,使用 Arrays.sort(nums) 对输入的数组进行升序排序。排序的目的是为了方便后续使用双指针方法,同时有助于去除重复的三元组。

2. 遍历数组: 代码使用一个 for 循环遍历数组,从第一个元素到倒数第三个元素。对于每个元素,执行以下步骤:

  • 提前结束条件: 在循环内部,首先检查当前元素是否大于零。如果当前元素大于零,由于数组已经排序,后续的元素也必然大于零,因此不可能再找到和为零的三元组,直接返回结果。
  • 跳过重复元素: 为了避免重复的三元组,检查当前元素是否和前一个元素相同。如果相同,跳过本次循环,继续下一个元素的处理。这一步确保每个元素只作为第一个数处理一次,避免重复。

3. 使用双指针寻找三元组: 对于每个固定的第一个元素,使用两个指针 leftright 分别指向剩余数组的头部和尾部。使用 while 循环,直到两个指针相遇。具体步骤如下:

  • 计算当前三元组的和 sum,即 nums[i] + nums[left] + nums[right]
  • 根据 sum 的值调整指针:
    • 如果 sum 大于零,说明和太大,需要减小和,因此将 right 指针左移一位。
    • 如果 sum 小于零,说明和太小,需要增大和,因此将 left 指针右移一位。
    • 如果 sum 等于零,说明找到了一个满足条件的三元组,将其添加到结果列表 result 中。

4. 去重处理: 找到一个符合条件的三元组后,需要继续调整指针 leftright,以避免重复的三元组:

  • left 指针右移,直到遇到不同的元素,确保每个三元组中的第二个数唯一。
  • right 指针左移,直到遇到不同的元素,确保每个三元组中的第三个数唯一。

5. 继续移动指针: 完成去重处理后,再次移动 leftright 指针,进行下一次查找。

6. 返回结果: 遍历完成后,返回结果列表 result,其中包含所有找到的不重复的和为零的三元组。

15. 3Sum

Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.

Notice that the solution set must not contain duplicate triplets.

Example 1:

Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
Explanation: 
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0.
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0.
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0.
The distinct triplets are [-1,0,1] and [-1,-1,2].
Notice that the order of the output and the order of the triplets does not matter.

Example 2:

Input: nums = [0,1,1]
Output: []
Explanation: The only possible triplet does not sum up to 0.

Example 3:

Input: nums = [0,0,0]
Output: [[0,0,0]]
Explanation: The only possible triplet sums up to 0.

Constraints:在这里插入图片描述

  • 3 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

上图是由 RealVisXL 生成

关键词:a girl seeing the sunset on the beach

更多内容欢迎关注我(持续更新中,欢迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

技术公众号:CodeZeng1998(纯纯技术文)

生活公众号:好锅(Life is more than code)

CSDN: CodeZeng1998

其他平台:CodeZeng1998好锅

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能】文本提取技术的算法延伸

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 文本提取技术中用到的算法 TF-IDF&#xff08;Term Frequency-Inverse Document Frequency…

数据分类分级,误把起点当终点

数据分类分级 吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 01 — 数据分类分级的定义 数据分…

Tuxera NTFS for Mac 2023软件:超级详细安装步骤(最新版软件下载)

软件简介&#xff1a; 在 Mac 上打开、编辑、复制、移动或删除存储在 Windows NTFS 格式 USB 驱动器上的文件。当您获得一台新 Mac 时&#xff0c;它只能读取 Windows NTFS 格式的 USB 驱动器。要将文件添加、保存或写入您的 Mac&#xff0c;您需要一个附加的 NTFS 驱动程序。…

论文Abstract怎么写

摘要是你要写的最后一项内容 步骤 首先先通读自己的文章&#xff0c;清楚自己写的文章是研究型还是技术型&#xff0c;适合描述性的摘要还是知识性。 描述性摘要内含研究目的、目标及方向等&#xff0c;不讲研究结果。字数大约100-200字。知识性摘要则包含研究结果&#xff0c…

语法05 C++ 浮点型/实数类型

什么是实数类型 实数类型是一种数据类型&#xff0c;实数类型变量里能存放小数和整数。 定义格式&#xff1a;double a; 赋值&#xff1a;a0.4; 输入&#xff1a;cin>>a; 输出&#xff1a;cout<<a; 训练&#xff1a;尺子的价格 小知在文具店买铅笔&#xff…

如何用Vue3构建一个交互式音乐播放器

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue.js 开发音乐播放器卡片 应用场景 这款音乐播放器卡片旨在为音乐应用程序提供一个现代而交互式的用户界面。它包含诸如歌曲信息、播放进度条和控制按钮等关键功能。 基本功能 **歌曲信息显示&#xff1a…

The Sandbox 游戏创作比赛|巴黎 CITY JAM

The Sandbox City Jam 邀请大家参与 The Sandbox 全新 Game Jam&#xff1a;City Jam&#xff01;活动将以社区为中心&#xff0c;每次一个城市&#xff0c;旨在将国际文化带入The Sandbox。你可以通过参与比赛赢得奖品&#xff0c;发展技能&#xff0c;并与其他创作者为伴&…

国标GB28181安防视频监控EasyCVR平台级联时上级平台不显示通道是什么原因?

国标GB28181安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有GA/T 1400、国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 有用户反馈&#xff…

【大模型应用开发极简入门】提示工程一:1. 通过context、task、role文本结构设计有效的提示词、 2. OpenAI的提示词任务示例

文章目录 一. chat_completion函数二. 设计有效的提示词1.上下文1.1. 更多细节的上下文1.2. 让GPT改进上下文 2.任务2.1. 提供足够的任务信息2.2. OpenAI的任务示例语法纠正总结TL;DR概要Python转自然语言计算时间复杂度修复Python bug产生python函数 3.角色 了解LLM和OpenAI A…

IEOSE 2024北京国际教育留学海外院校展览会11月举办

IEOSE 2024北京国际教育留学展览会 IEOSE 2024 Beijing International Education and Overseas Study Exhibition 2024年11月15日-11月17日&#xff08;周五-周日&#xff09; 15th-17th November, 2024 北京国家会议中心 China National Convention Ce…

【Three.js】知识梳理十:Three.js纹理贴图

1. 纹理贴图 在Three.js中&#xff0c;纹理贴图是一种将二维图像贴到三维物体表面的技术&#xff0c;以增强物体的视觉表现。纹理贴图可以使物体表面更加真实、细腻&#xff0c;为场景增色不少。 在Three.js中&#xff0c;纹理贴图的加载主要通过THREE.TextureLoader类实现。…

LeetCode | 26.删除有序数组中的重复项

在我接触到这道题的时候想的就是一次遍历&#xff0c;设置两个变量记录当前遍历到的数字和对应原数组应该修改的index&#xff0c;在运行过程中&#xff0c;因为原数组已经是有序的了&#xff0c;只不过会存在重复的数字&#xff0c;但是这些重复的数字也是挨在一起的&#xff…

RT-Thread系统使用STM32H7芯片串口5不工作

使用stm32h743芯片串口5不工作&#xff0c;其他串口都正常&#xff0c;TX5->PC12,RX5->PD2 drv_usart.c里面串口5的TX和RX反了&#xff0c;将TX和RX对调后解决。

opencv学习笔记 -- 如何扫描图像

本节主要解决以下几个问题&#xff1a; 如何遍历图像的每一个像素如何存储opencv的矩阵如何衡量算法的性能查询表是什么并且为何要使用该表 举一个例子 如果是使用RGB的格式&#xff0c;数据格式采用unsigned char来进行储存&#xff0c;则每个像素点有256个不同的值&#x…

如何给自己的项目实现在线测试的接口文档knife4j

配置实现Knife4j在线接口测试文档 为什么要是实现这个东西呢&#xff1f;肯定是对我们有用的&#xff0c;后端主要编写的就是接口&#xff0c;然后我们将接口编写好了之后肯定还是需要进行调试看是否能够正常使用且按照规范返回对应的数据。相信大家测试都是基本上使用的是一些…

【紧急警示】Locked勒索病毒利用最新PHP远程代码执行漏洞大规模批量勒索!文末附详细加固方案

1. Locked勒索病毒介绍 locked勒索病毒属于TellYouThePass勒索病毒家族的变种&#xff0c;其家族最早于2019年3月出现&#xff0c;擅长利用高危漏洞被披露后的短时间内&#xff0c;利用1Day对暴露于网络上并存在有漏洞未修复的机器发起攻击。该家族在2023年下半年开始&#xf…

【CS.PL】Lua 编程之道: 基础语法和数据类型 - 进度16%

2 初级阶段 —— 基础语法和数据类型 文章目录 2 初级阶段 —— 基础语法和数据类型2.0 关键字(keywords) &#x1f525;2.1 注释与标识符2.1.1 注释2.1.2 标识符 2.2 变量与赋值2.2.1 所有变量默认是全局变量 ≠ local, 有一个例外2.2.2 local变量是局部变量, 以end作为边界2.…

ARM32开发--RTC内置实时时钟

知不足而奋进 望远山而前行 目录 系列文章目录 文章目录 前言 学习目标 学习内容 RTC时钟介绍 RTC结构框图 RTC原理图 RTC时钟电源 RTC的配置流程 RTC时钟 开发流程 RTC初始化 时钟配置 时钟获取 BCD格式转化 完整代码 RTC时钟备份寄存器 总结 前言 在嵌入式…

【CS.DB】深度解析:ClickHouse与Elasticsearch在大数据分析中的应用与优化

文章目录 《深入对比&#xff1a;在大数据分析中的 ClickHouse和Elasticsearch》 1 介绍 2 深入非关系型数据库的世界2.1 非关系型数据库的种类2.2 列存储数据库&#xff08;如ClickHouse&#xff09;2.3 搜索引擎&#xff08;如Elasticsearch&#xff09;2.4 核心优势的归纳 3…

准研究生了解内容:如何挑选论文并下载

本文主要纪录自己从0开始摸索如何找论文&#xff0c;下载论文等的过程。 前言 &#xff08;一点想法&#xff09;## 作为准研究生&#xff0c;上岸后一直非常颓废&#xff0c;除了给人补课挣了点money&#xff0c;剩下时间都是打游戏&#xff0c;被老姐训诫后决定继续学习。毕…