leetcode15三数之和(重点讲去重)

本文主要讲解三数之和的要点与细节,主要讲解利用双指针的方法解决,按照步骤一步步思考方便理解

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

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

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

c++与java代码如下,末尾

具体要点:
1.
本题核心要点在于,三元组里面的数的顺序是不重要的,结果不能包含重复的三元组

        这就要求我们要对结果进行去重的操作,也是本题最需要考虑清楚的


2. 这道题我们可以采用双指针(滑动窗口)或者 哈希表的方法来处理,但是相比于哈希表,双指针考虑去重要更简单一点,我们先重点讲解双指针的解法


3. 一直说去重去重,到底是什么呢?

去重的核心操作是:判断上一个或者下一个值是否等于当前值,若等于,就跳过,再去判断下一个


4. 所以我们第一步就要对数组进行排序,目的是让相同的值都挨在一起,方便去重


5. 然后我们for循环遍历数组,获取a的值,即nums[i]

然后我们需要考虑一下a去重的问题:如果 i 和 i-1 位置的值相等,那么就跳过(这里有小细节最后讲)

         if (i > 0 && nums[i] == nums[i - 1]) continue;


6. 接着在a=nums[i]条件下,定义两个指针 left = i + 1 和 right = nums.size() - 1,其值分别代表b和c

        记录 sum=nums[i] + nums[left] + nums[right]

        然后就开始滑动,通过判断sum和0的大小

        若sum>0则right--

        若sum<0则left++

        若sum==0则把i、left、right加入结果


7. 当我们 “sum==0则把i、left、right加入结果”之后,我们需要向中间移动left和right,但是移动后位置会出现和上个位置重复值的情况,此时我们就要对 b 和 c 去重了

//对b去重,此时判断的是下一个位置,因为要确定移动到哪
while (left < right && nums[right] == nums[right - 1]) right--;
//对c去重,此时判断的是下一个位置,因为要确定移动到哪
while (left < right && nums[left] == nums[left + 1]) left++;
//直到没有重复的,我们就正常移动
left++;
right--;

最后返回result即可 


8. 细节问题

        a,b,c去重操作一样吗,好像还不太一样

        a比较的是 nums[i] 与 nums[i - 1]。是和移动的上一个进行比较

        b和c比较的是 nums[right] == nums[right - 1] 与 nums[left] == nums[left + 1]。是和移动的下一个位置进行比较(虽然right是-,left是+,但是他们是往中间移动)

        为什么a的i不能和i+1比较呢?

        因为,i+1的位置放的是left呀(b)!   a不需要和b进行去重呀!abc三者重复是可以的

        理解不了?举个例子:nums={-1,-1,-2}

        a是第一个-1,如果i和i+1比较,下一个也是-1,就跳过咯,a直接指向第二个-1(left和right也取不到第一个-1),就错了


c++代码:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {//定义一个vector保存结果vector<vector<int>> result;//对数组排序sort(nums.begin(), nums.end());for (int i = 0; i < nums.size(); i++) {if (nums[i] > 0)return result;//对a去重,此时判断的是上一个位置,如果判断的是下一位,就大错特错,因为下一位放的是left,left和i相等是不影响结果的if (i > 0 && nums[i] == nums[i - 1]) continue;//定义两个指针int left = i + 1;int right = nums.size() - 1;//执行滑动操作while (left < right) {int sum=nums[i] + nums[left] + nums[right];if (sum > 0) {right--;    }else if (sum < 0) {left++;}else {result.push_back(vector<int>{nums[i], nums[left], nums[right]});//对b去重,此时判断的是下一个位置,因为要确定移动到哪while (left < right && nums[right] == nums[right - 1]) right--;//对c去重,此时判断的是下一个位置,因为要确定移动到哪while (left < right && nums[left] == nums[left + 1]) left++;left++;right--;}}}return result;}
};

java代码

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<>();//先排序Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {if (nums[i] > 0) return result;//去重aif (i > 0 && nums[i] == nums[i - 1]) continue;//定义双指针int left = i + 1, 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 {//等于0,添加进resulresult.add(Arrays.asList(nums[i], nums[left], nums[right]));//添加完成后,移动b和c,准备对下一个位置循环,在此之前,要先去重操作,不然移动了还会有重复的while (left < right && nums[left] == nums[left + 1]) left++;while (left < right && nums[right] == nums[right - 1]) right--;//去重完成,移动b和cright--;left++;}}}return result;}
}

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

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

相关文章

seata原理源码分析系列(一)架构, 组件

简介 SEATA开源的分布式事务解决方案&#xff0c;用于解决分布式系统中的数据一致性问题&#xff0c;由阿里巴巴开源。 分布式系统&#xff0c;数据存储在不同的资源管理器(数据库)&#xff0c;需要保证分布式事务的原子性&#xff0c;业界比较常用xa&#xff0c;数据库标准实现…

C语言 | Leetcode C语言题解之第151题反转字符串中的单词

题目&#xff1a; 题解&#xff1a; void myResverse(char* s,int start,int end){while(start<end){char temp s[start];s[start] s[end];s[end] temp;start;end--;} } char* reverseWords(char* s) {int start 0;int end strlen(s)-1;myResverse(s,start,end);if(s[…

面试题:Redis是什么?有什么作用?怎么测试?

有些测试朋友来问我&#xff0c;redis要怎么测试&#xff1f;首先我们需要知道&#xff0c;redis是什么&#xff1f;它能做什么&#xff1f; redis是一个key-value类型的高速存储数据库。 redis常被用做&#xff1a;缓存、队列、发布订阅等。 所以&#xff0c;“redis要怎么测试…

Linux系统使用Docker安装Dashy导航页结合内网穿透一键发布公网

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起&#xff0c;形成自己的导航…

Android10 动态修改开机动画(二)设置分区权限

Selinux配置策略 配置init.common.rc文件 device\sprd\sharkle\common\rootdir\root\init.common.rc restorecon_recursive /mnt/animchmod 0777 /mnt/animchown root system /mnt/anim restorecon_recursive /mnt/anim &#xff1a;如果anim变成u:object_r:unlabeled:s0 &…

【Linux】linux 添加sftp用户

linux 添加sftp用户 在Linux系统中&#xff0c;可以通过以下方法来添加SFTP用户&#xff1a; 方法一&#xff1a;使用useradd命令手动创建用户&#xff0c;并为其设置SFTP登录权限&#xff1a; sudo useradd -m -s /bin/false <username> # 创建用户&#xff0c;禁用s…

从输入URL到页面加载完中间发生了什么?

当浏览器地址栏的 URL 发生变化时&#xff0c;通常会经历以下步骤&#xff1a; 用户输入或导航操作&#xff1a;用户在地址栏中输入新的 URL 或者通过点击链接、前进/后退按钮等进行导航操作。 URL 解析&#xff1a;浏览器会解析新的 URL&#xff0c;并将其拆分为不同的组成部…

医院信息化运维的监控“神器”有哪些

为了提高医院运维团队的一体化运维监控能力&#xff0c;可以引入以下先进的监控工具&#xff1a; 1. 监控易一体化运维管理软件 - 这是一个分布式、一体化运维管理平台&#xff0c;具备全面、高效、安全、灵活的特点&#xff0c;非常适合医院复杂的信息系统环境。 - 监控易可以…

机器视觉:工业镜头的主要参数

工业镜头是图像采集系统的重要光学设备。它的作用是将目标物体的像成在相机的感光面上。 一、工业镜头原理 镜头是对光线进行调制和变换&#xff0c;使目标能够成像到相机的感光芯片上。将不同折射率的硝材加工成高精度的曲面&#xff0c;再把这些曲面进行组合后设计成能够满…

使用 Selenium 自动化获取 CSDN 博客资源列表详解

使用 Selenium 自动化获取 CSDN 博客资源列表详解 在本文中,我们将详细介绍如何使用 Selenium 自动化工具来滚动页面并获取 CSDN 博客上博主发布的资源列表。我们将逐步展示代码实现过程,并解释每个步骤的作用和原理。 1. 准备工作 在开始之前,请确保已经安装了以下软件和…

秋招突击——6/14——复习{(树形DP)树的最长路径}——新作{非递归求二叉树的深度、重复区间合并}

文章目录 引言复习树形DP——树的最长路径 新作使用dfs非递归计算二叉树的深度多个区间合并删除问题实现思路实现代码参考思路 总结 引言 这两天可能有点波动&#xff0c;但是算法题还是尽量保证复习和新作一块弄&#xff0c;数量上可能有所差别。 复习 树形DP——树的最长路…

React state(及组件) 的保留与重置

当在树中相同的位置渲染相同的组件时&#xff0c;React 会一直保留着组件的 state return (<div><Counter />{showB && <Counter />} </div> ) // 当 showB 为 false, 第二个计数器停止渲染&#xff0c;它的 state 完全消失了。这是因为 React…

vite.config.js如何使用env的环境变量

了解下环境变量在vite中 官方文档走起 https://cn.vitejs.dev/guide/env-and-mode.html#env-variables-and-modes 你见到的.env,.env.production等就是放置环境变量的 官方文档说到.env.[mode] # 只在指定模式下加载,比如.env.development只在开发环境加载 至于为什么是deve…

windows下open webui+ollama+sd webui

原文&#xff1a;https://wangguo.site/Blog/2024/Q2/2024-06-14/ 说明&#xff1a;安装使用环境是在Windows下 1、给ollama一个好看的交互界面&#xff08;open webui&#xff09; 1.1、ollama安装 安装&#xff1a;在ollama官网下载windows版本进行安装 模型列表&#xff1…

【SQLAlChemy】表之间的关系,外键如何使用?

表之间的关系 数据库表之间的关系分为三种&#xff1a; 一对一关系&#xff08;One-to-One&#xff09;&#xff1a;在这种关系中&#xff0c;表A的每一行都与表B的一行关联&#xff0c;反之亦然。例如&#xff0c;每个人都有一个唯一的社保号&#xff0c;每个社保号也只属于…

南师大GIS专业2024排名NO.1!!!

南师大GIS 666 学科专业实力666&#xff0c;研究方向多多多&#xff01; 有学术方向有开发应用方向&#xff0c; 有GIS&#xff08;建模、数字地形、基础理论和三维GIS等&#xff09;、 有Cartography &#xff08;叙事地图、动态地图、地图风格迁移等&#…

Visual Studio Code 的安装教程和配置C语言环境插件推荐

目录 1.vscode简介2.下载安装vs code3.VSCode基础配置VSCode界面简介VSCode设置中文界面VSCode个性化设置VSCode常用设置基本编辑快捷键VSCode常用快捷键 4.下载安装MinGW5.设置vscode里的环境6.插件推荐7.vscode官方文档 1.vscode简介 VSCode是微软出的一款轻量级编辑器&…

Javaweb03-Servlet技术1(Servlet,ServletConfig,ServletContext)

Servlet技术(Servlet,ServletConfig,ServletContext) 1.Servlet的概述 Servlet是运行在Web服务器端的Java应用程序&#xff0c;它使用Java语言编写。与Java程序的区别是&#xff0c;Servlet 对象主要封装了对HTTP请求的处理&#xff0c;并且它的运行需要Servlet容器(Tomcat)的…

人工智能历史与现状

1 人工智能历史与现状 1.1 人工智能的概念和起源 1.1.1 人工智能的概念 人工智能 (Artificial Intelligence ,AI)是一门研究如何使计算机 能够模拟人类智能行为的科学和技术,目标在于开发能够感知、理解、 学习、推理、决策和解决问题的智能机器。人工智能的概念主要包含 以…

YOLOv8改进 | 注意力机制 | 正确的 Self-Attention 与 CNN 融合范式,性能速度全面提升【独家创新】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 卷积和自注意力是两种强大的表征学习技术,它们通常被认为是彼此不同的两种平行方法。ACmix模型通过结合卷积和自注意力的优势,旨在解决卷积神经网络和自注意力模型在表征学习中的各自局限性,提高模型性能。它…