【LeetCode】——双指针(快慢指针)/多指针

news2024/11/19 23:34:38

 =========================================================================

个人主页

代码仓库

C语言专栏

初阶数据结构专栏

Linux专栏

=========================================================================


前言

大家好!这是新开的LeetCode刷题专栏,这个专栏不只是随便的拿一些我练过的题讲解,而是总结我在刷题中的一些方法适用于一大类的题,是给大家提供这一大类题的解题方法或者思路,希望能给一些刚开始刷题的小白提供帮助,防止他们在刚开始刷题时,由于LeetCode的难度而从入门到入土,从而放弃,刚开始也是使用最基础的C语言来讲解。

第一期,今天给大家带来的是双指针也可以叫做快慢指针,甚至是多指针,这种解题方法大多适用于对数组中数的操作,移动、删除等等。话不多说让我们开始刷题吧!

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

OJ链接

题目描述:

给你一个 非严格递增排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。

示例 1:

输入:nums = [1,1,2] 输出:2, nums = [1,2,_]

解释:函数应该返回新的长度 2 ,并且原数组nums的前面两个元素被修改为 1,2 .不需要考虑数组中超出新长度后面的元素
示例 2:
输入:
nums = [0,0,1,1,1,2,2,3,3,4]

输出:5, nums = [0,1,2,3,4]

解释:函数因该返回新的长度 5 ,并且原数组nums的前五个元素被修改为 0, 1,2,3,4。不需要考虑数组中超出新长度后面的元素。

审题总结:给你一个数组,删除这个数组中相同的元素,并且返回数组的长度。

思路讲解:

解法:开辟两个指针都指向头,一个指针先向后移动并和前面的数比较判断,如果前一个指针指向的值和后一个指针指向的值相等,后一个指针向前移动一位,然后前指针继续移动,直到和后一个指针的值不相等时,将前一个指针的值赋给后一个指针的值,后一个指针向前移动,重复前面的操作直到遍历整个数组,这时后一个指针指向数组最后一个数据,返回这个数组的值加1便是数组的长度。

接口代码

    int left=0;
    int right=0;
    while(right<numsSize)
    {
        if(nums[right]==nums[left])
        {
            right++;
        }
        else
        {
            left++;
            nums[left]=nums[right];
        }
    }
    return left+1;

 LeetCode 27.移除元素

OJ链接

题目描述: 

给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。

注意:不要使用额外的数组空间,你仅需使用O(1)额外空间并原地修改输入的数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素

示例 1:

输入:nums = [3,2,2,3], val = 3

输出:2, nums = [2,2]

解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2

输出:5, nums = [0,1,4,0,3]

解释:函数应该返回新的长度5,并且nums中的前五个元素为0,1,3,0 ,4。注意这五个元素可以为任意顺序。你不需要考虑数组中超出新长度后面的元素。

审题总结:给你一个数组和一个值,删除这个数组中和这个值相同的元素,并返回数组的长度。

思路讲解:

解法一:创建新数组

首先我们就会想到创建一个新数组,通过遍历原数组中的值将和val不相等的值放到新数组中,但是这种思路的空间复杂度为O(N),和题目要求的空间复杂度O(1)不符合,因此这种思路在这道题行不通。

解法二:双指针(快慢指针)

在一开始定义两个指针指向数组的头,前指针遍历数组,当前指针的值和val的值不同时,将前指针的值赋给后一个指针,后一个再移动,直到前指针遍历完整个数组,返回后指针。

接口代码 

   int left=0;
    int right=0;
    for(right=0;right<numsSize;right++)
    {
        if(nums[right]!=val)
        {
            nums[left]=nums[right];
            left++;
        }
    }
    return left;

LeetCode 88.合并两个有序数组

OJ链接

题目描述: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3

输出:[1,2,2,3,5,6]

解释:需要合并 [1,2,3] 和 [2,5,6] 。 合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0

输出:[1]

解释:需要合并 [1] 和 [] 。 合并结果是 [1] 。

示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1

输出:[1]

解释:需要合并的数组是 [] 和 [1] 。 合并结果是 [1] 。 注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

审题总结:

给你两个数组,一个数组的长度等于两个数组中的有效数据之和,将长度短的数组合并到长度长的数组中并排序。

思路讲解:三指针

这里我们定义三个指针分别指向长数组中的尾,长数组中最后一个有效数据,段数组中的尾,依次向前移动遍历长数组中的有效数据和短数组中的数据相比较,将较大的值放在长数组中的尾部。

这里我们还要注意一种特殊情况:如果段数组中的每个值都比长数组中有效数据的值都小的话,长数组中的有效数据移动完了,短数组的尾指针还没有移动,这样我们直接将短数组中的值移动到长数组中就行了。因为题目中已经说了是非递减顺序

接口代码

int end1=m-1;
int end2=n-1;
int end=m+n-1;
while(end1>=0&&end2>=0)
{
    if(nums1[end1]>nums2[end2])
    {
        nums1[end--]=nums1[end1--];
    }
    else
    {
        nums1[end--]=nums2[end2--];
    }
}
while(end2>=0)
{
    nums1[end--]=nums2[end2--];
}

这一期的快慢指针的三道题目就讲到这里了,这里只是给大家提供一点刷题的方法思路,希望大家以后再做题过程中可以运用到,当然快慢指针不仅适用于数组的题目,再数据结构的顺序表和链表中也可以用到,也不仅仅是两个指针,甚至可以是很多。

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

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

相关文章

STL-函数对象、谓词、常用算法

函数对象 函数对象概念 重载函数调用操作符的类&#xff0c;其对象常称为函数对象 函数对象使用重载的()时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数 本质&#xff1a; 函数对象&#xff08;仿函数&#xff09;是一个类&#xff0c;不是一个函数 函数对象使用…

第一章:最新版零基础学习 PYTHON 教程(第十节 - Python 语句中的 – Python 如果否则)

在现实生活中,有时我们需要做出一些决定,并根据这些决定来决定下一步应该做什么。在编程中也会出现类似的情况,我们需要做出一些决定,并根据这些决定我们将执行下一个代码块。编程语言中的决策语句决定了程序执行流程的方向(控制流)。 Python 中的控制流类型 在Python…

计算π的近似值分数 ——python

利用格里高利公式&#xff1a; 计算 的近似值&#xff0c;直到最后一项的绝对值小于给定精度eps。 输入格式: 输入小于1且大于0的阈值。 输出格式: 输出满足阈值条件的近似圆周率&#xff0c;输出到小数点后6位。 输入样例: 在这里给出一组输入。例如&#xff1a; 0.0…

基于Quartz的可视化UI操作组件GZY.Quartz.MUI更新说明(附:在ABP中集成GZY.Quartz.MUI可视化操作组件)

NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介 像swaggerUI一样,项目入侵量小,仅需要在Startup中注入的UI组件 先上一张效果图,给没用过的兄弟们科普一下,如图: 更新内容 接下来,介绍一下更新了哪些功能. 1.修复采用数据库持久化数据的情况下,偶尔出现的异常…

一、vue2的基础语法巩固

一、定义&#xff1a;是一个渐进式的JavaScript框架 二、特点&#xff1a; 减少了大量的DOM操作编写 &#xff0c;可以更专注于逻辑操作分离数据和界面的呈现&#xff0c;降低了代码耦合度(前端端分离)支持组件化开发&#xff0c;更利于中大型项目的代码组织 vue2核心功能&a…

NIO简单介绍

一、什么是NIO 1、Java NIO全称java non-blocking IO&#xff0c; 是指JDK提供的新API。从JDK1.4开始&#xff0c;Java提供了一系列改进的输入/输出的新特性&#xff0c;被统称为NIO(即New IO)&#xff0c;是同步非阻塞的 2、NIO有三大核心部分: Channel(通道)&#xff0c; Buf…

2023-9-23 区间覆盖

题目链接&#xff1a;区间覆盖 #include <iostream> #include <algorithm>using namespace std;const int N 100010;int n; struct Range {int l, r;bool operator< (const Range &W) const{return l < W.l;} }range[N];int main() {int st, ed;cin >…

Mybatis-Flex框架初体验

本篇文章内容主要包括&#xff1a; MyBatis-Flex 介绍 MyBatis-Flex 是一个优雅的 MyBatis 增强框架&#xff0c;它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用Mybaits-Flex链接任何数据库&#xff0c;其内置的QueryWrapper亮点帮助我们极大的减少了SQL编写的工…

SpringBoot3项目中配置JDK17

概述 SpringBoot3需要JDK17的支持&#xff0c;不再支持JDK8。 如果要运行SpringBoot3的项目&#xff0c;根据使用的IDE&#xff0c;需要的配置不同。 配置说明 1. SpringToolSuite4 如果使用的是SpringToolSuite4&#xff08;STS&#xff09;&#xff0c;比较简单&#xf…

Linux 链表示例 LIST_INIT LIST_INSERT_HEAD

list(3) — Linux manual page 用Visual Studio 2022创建CMake项目 * CmakeLists.txt # CMakeList.txt : Top-level CMake project file, do global configuration # and include sub-projects here. # cmake_minimum_required (VERSION 3.12)project ("llist")# I…

法线贴图的视线原理

在上一篇文章中详细介绍了位移贴图的相关知识&#xff0c;在本章中我们继续讲述法线贴图的相关概念&#xff0c;文章后面继续用GLTF 编辑器 来演示下法线贴图的模型渲染效果。 1、什么是法线贴图 法线贴图&#xff08;Normal Map&#xff09;是一种纹理映射技术&#xff0c;用…

Vivado 综合属性之use_dsp48

use_dsp48综合属性提示综合工具如何处理算术运算的实现结构&#xff1b;在默认的情况下&#xff0c;如下的算术类型结构会综合成DSP48E资源&#xff1b; MultMult-add&Mult-subMult-accumulate 而adders&#xff0c;subtracters&#xff0c;与accumulators在默认情况下会使…

安装Linux虚拟机——以ubuntukylin-16.04.7-desktop-amd64.iso为例

正文 安装VMware 重要提示 安装软件之前&#xff0c;请先退出360、电脑管家等安全类软件&#xff0c;这类软件会阻止我们安装的软件进行注册表注册&#xff0c;很可能导致安装失败。确认物理机&#xff08;也就是你自己使用的电脑&#xff09;的防火墙已经关闭。 下载 打开…

23062day4

制作一个简易圆形时钟 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QDebug> #include <QPainter> #include <QTimerEvent> #include <QTime> #include <QThread> …

vue重修002

文章目录 版权声明一 指令修饰符1. 什么是指令修饰符&#xff1f;2. 按键修饰符3. v-model修饰符4. 事件修饰符 二 v-bind对样式控制的增强-操作class1. 语法&#xff1a;2. 对象语法3. 数组语法4. 代码练习 三 京东秒杀-tab栏切换导航高亮四 v-bind对有样式控制的增强-操作sty…

同源策略和跨域问题的解决

跨域问题 跨域问题顾名思义是当浏览器对不同于当前域的一个域下的资源进行访问和操作而产生的一系列**问题。**这些限制问题的产生是因为浏览器出于安全考虑对同源请求放行&#xff0c;对异源请求限制的一种规则&#xff0c;这种规则就是同源策略&#xff0c;因此限制造成的开…

【AI视野·今日NLP 自然语言处理论文速览 第三十八期】Thu, 21 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 21 Sep 2023 Totally 57 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Chain-of-Verification Reduces Hallucination in Large Language Models Authors Shehzaad Dhuliawala, Mojt…

基于springboot+vue的信息技术知识赛系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

计算机视觉与深度学习-循环神经网络与注意力机制-Attention(注意力机制)-【北邮鲁鹏】

目录 引出Attention定义Attention-based model通俗解释应用在图像领域图像字幕生成&#xff08;image caption generation&#xff09;视频处理 序列到序列学习&#xff1a;输入和输出都是长度不同的序列 引出Attention 传统的机器翻译是&#xff0c;将“机器学习”四个字都学…

Linux三大搜索指令的区别

find&#xff1a;可以在指定的路径下进行文件的搜索 —— 真的在磁盘文件中查找 例如find /usr/bin/ -name ls which 可以在指令路径下&#xff0c;/usr/bin,搜索指令文件 例如&#xff1a;which ls whereis:在系统特定的路径下查找&#xff0c;既可以找到可执行程序&#xff…