【双指针】Leetcode 三数之和

news2024/11/18 17:34:04

题目解析

15. 三数之和
在这里插入图片描述
这道题有两个需要注意的地方:1. 三个数字也不可以是同一个位置上的 2. 最终结果里面的三元组不可以是重复的

所以这道题就需要对结果实现去重这一个逻辑,遇到相同的数字就需要往后面移动,忽略


算法讲解

1. 首先对数组进行排序
在这里插入图片描述
对数组进行排序之后,我们就可以使用上一道题"两数之和"的算法思想,在有序区间里面寻找两个数字之和 == target的二元组,但是我们这里是三元组,使用双指针只能寻找两个数字。因此我们可以确定一个数字,在剩下的区间中寻找target == 0 - 确定的数字,所以这样这道题就转化为寻找target二元组(还需要去重!!!)

2. 完成三元组问题转化为二元组的实现
在这里插入图片描述
3. 完成去重

  1. 首先需要对left 和 right 指针进行去重,寻找到nums[left] + nums[right] == target的时候,两个指针可以一起向中心移动一步,这个时候就需要对对撞指针进行去重了,因为如果移动之后的指针还是移动之前的值的话,那么最终出来的三元组还是上一个,放在最终结果里面肯定不可以
  2. 其次还是需要对当前确定的这个数字进行去重,道理同上面对撞指针的原理一样
//对i去重
if(i != 0 && nums[i] == nums[i-1]) continue;


//对 双指针 去重
while(left < right && nums[left - 1] == nums[right])
{
	left++;
}
while(right > left && nums[right + 1] == nums[right])
{
	right--;
}

代码编写

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        //先给数组排序
        sort(nums.begin(), nums.end());
        vector<vector<int>> ret;
        int n = nums.size();
        //确定一个数字 寻找其他区间的两数之和
        for(int i = 0; i < n; i++)
        {
            if(nums[i] > 0) break;
            //对i去重
            if(i != 0 && nums[i] == nums[i-1]) continue;
            int left = i + 1;
            int right = n - 1;
            int target = 0 - nums[i];  //寻找两数之和的target
            while(left < right)
            {
                if(nums[left] + nums[right] == target)
                {
                    ret.push_back({nums[left], nums[right], nums[i]});
                    left++;
                    right--;
                    //对 双指针 去重
                    while(left < right && nums[left - 1] == nums[right])
                    {
                        left++;
                    }
                    while(right > left && nums[right + 1] == nums[right])
                    {
                        right--;
                    }
                }
                else if(nums[left] + nums[right] > target)
                {
                    right--;
                }
                else left++;
            }
        }
        return ret;
    }
};

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

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

相关文章

2024蓝桥杯每日一题(状压DP)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;毕业旅行问题 试题二&#xff1a;蒙德里安的梦想 试题三&#xff1a;最短Hamilton路径 试题四&#xff1a;国际象棋 试题一&#xff1a;毕业旅行问题 【题目描述】 小明目前在做一份毕…

集合系列(十六) -集合知识回顾整理

一、摘要 在 Java 中&#xff0c;集合大致可以分为两大体系&#xff0c;一个是 Collection&#xff0c;另一个是 Map&#xff0c;都位于java.util包下。 Collection &#xff1a;主要由 List、Set、Queue 接口组成&#xff0c;List 代表有序、重复的集合&#xff1b;其中 Set…

一文读懂Cache一致性原理

1. 为何需要cache一致性 访问memory数据的速度相比core的运行速度来说&#xff0c;要花费更多的时钟周期&#xff0c;为了减轻这个差异引进了存储器层次结构&#xff0c;如图1所示。在层次结构中&#xff0c;越往上&#xff0c;读写速度越快&#xff0c;价格更贵&#xff0c;存…

Prometheus(六):Blackbox监控安装配置

目录 1 Blackbox Exporter安装配置1.1 Blackbox Exporter简介1.2 安装1、安装-使用源码包安装下载安装blackbox.yml文件配置快速启动文件 2、安装-使用docker 1.3 Prometheus配置1、http监控2、ping探测-ip3、https probe-DNS解析4、metrics配置5、TCP监控-探测端口 总结 1 Bla…

Element UI中日期选择日(date-picker)等其他选择器下拉显示错位、位置错误解决

省流版 给选择器加上唯一key&#xff08;下面的想看就看&#xff09; 问题复现 需求是用一个下拉切换时间维度的选择&#xff0c;分别为年度、季度、月度&#xff0c;但是开发的时候发现&#xff0c;当切换的时候&#xff0c;视图可正常切换&#xff0c;但点击选择时却发现选…

InfoNCE loss

InfoNCE loss是一种用于自监督学习的损失函数&#xff0c;通常用于训练对比学习模型&#xff0c;如自编码器或神经网络。全称是"InfoNCE: Contrastive Estimation of Neural Entropy"&#xff0c;基于对比学习的思想&#xff0c;旨在最大化正样本的相似性&#xff0c…

关于 C/C++ 1Z(17)开源项目 openppp2 协同程式切换工作流

下述为开源项目 openppp2&#xff08;github&#xff09;构建工作在 C/C 17 的 stackful 有栈协同程式的工作流切换示意图&#xff1a; 在 openppp2 之中采用人工手动方式管理协同程式之间的切换&#xff0c;每个中断过程只是保存线程栈信息&#xff08;如寄存器、当前#PC EIP&…

利用idea创建一个maven web工程

1.创建Maven项目 2.选择不使用Web项目骨架&#xff08;即普通maven项目&#xff09; 3.创建成功后在pom.xml设置打包方式为war&#xff0c;并重构maven项目 <packaging>war</packaging> 4.补齐Maven Web项目缺失webapp的目录结构 右键项目名打开模块设置&#xf…

【STM32+HAL】I2C+DMA读取AS5600编码器

一、DMA的应用 有关更多DMA的应用&#xff0c;详见【STM32HAL】DMA应用 二、HAL库配置 1、开启I2C 开启对应DMA及中断 2、开启串口通信 至此&#xff0c;HAL库配置完毕 三、DMA版&#xff08;高效但不稳定&#xff09; 1、as5600.c #include "AS5600.h" #includ…

Javascript本地存储的方式,区别及应用场景

文章目录 一、方式cookielocalStorage特点sessionStorage扩展的前端存储方式优点&#xff1a;缺点&#xff1a; 二、区别三、应用场景相关连接 一、方式 javaScript本地缓存的方法我们主要讲述以下四种&#xff1a; cookiesessionStoragelocalStorageindexedDB cookie Cook…

【Python】python编程初探2---字符编码,输入和输出,初识数据类型

欢迎来CILMY23的博客 本篇主题为【Python】python编程初探2---字符编码&#xff0c;输入和输出&#xff0c;初识数据类型 个人主页&#xff1a;CILMY23-CSDN博客 Python系列专栏&#xff1a;​​​​​​​http://t.csdnimg.cn/rAsEH 上一篇博客&#xff1a;http://t.csdni…

网络层协议之IP协议

网络层主要做两方面事情&#xff1a; 1.地址管理&#xff1a;制定一系列规则&#xff0c;通过地址描述出网络上的一个设备的位置 2.路由选择&#xff1a;网络环境复杂&#xff0c;从一个节点到另一个节点之间有很多条路径&#xff0c;这就需要通过路由选择来筛选/规划出更合适…

Day18:LeedCode 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513. 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 思路:出该二叉树的 最底层 最左边 节点的值找出深度最大的第一个结点(左结点先遍历) 方法一…

数据库与缓存一致性如何保证

最近建了一个技术交流群&#xff0c;欢迎志同道合的同学加入&#xff0c;群里主要讨论&#xff1a;分享业务解决方案、深度分析面试题并解答工作中遇到的问题&#xff0c;同时也能为我提供写作的素材。 欢迎加Q&#xff1a;312519302&#xff0c;进群讨论 前言 在工作中&#…

LangChain使用实例——RAG

Q&A with RAG Overview LLMs支持的最强大的应用程序之一是复杂的问答 (Q&A) 聊天机器人&#xff0c;这些应用程序可以回答有关特定源信息的问题&#xff0c;使用一种称为检索增强生成&#xff08;RAG&#xff09;的技术。 RAG RAG 是一种利用额外数据增强 LLM 知识…

linux 网卡配置 vlan/bond/bridge/macvlan/ipvlan 模式

linux 网卡模式 linux网卡支持非vlan模式、vlan模式、bond模式、bridge模式&#xff0c;macvlan模式、ipvlan模式等&#xff0c;下面介绍交换机端及服务器端配置示例。 前置要求&#xff1a; 准备一台物理交换机&#xff0c;以 H3C S5130 三层交换机为例准备一台物理服务器&…

如何用智能AI绘一幅世界地图?

今天我们分享一下&#xff0c;用智能AI绘一幅世界地图的方法&#xff01; 为了方便你极速体验&#xff0c;特意在文末为你准备了登录帐号&#xff0c;省去你注册的烦恼。 认准AI绘画官网 如果你在百度搜索“AI绘画”或“Midjourney”&#xff0c;找出来的基本全是广告&#…

matplotlib画图:子图中坐标轴与标题重合...

如下图 只要在代码最后加入 plt.tight_layout() 就可以自动调节

Java练习题目6:水仙花数是指其个位,十位和百位三个数字的立方和等于其自身的三位数,求出所有的水仙花数。(Daddodil6)

每日小语 要相信卷首以卷尾为前提&#xff0c;几乎同卷尾以卷首为前提是一样的。——叔本华 思考 //水仙花数是指其个位&#xff0c;十位和百位三个数字的立方和等于其自身的三位数&#xff0c;求出所有的水仙花数。 import java.util.Scanner; public class Daddodil6 {publ…

服务运营 | 印第安纳大学翟成成:改变生活的水井选址

编者按&#xff1a; 作者于2023年4月在“Production and Operations Management”上发表的“Improving drinking water access and equity in rural Sub-Saharan Africa”探讨了欠发达地区水资源供应中的可达性和公平性问题。作者于2020年1月去往非洲埃塞俄比亚提格雷地区进行…