详细解析如何用“双指针“解题(面试必备,小白一看就会系类)

news2025/1/11 7:15:26

一、前言

     大家在平时的训练和交流中肯定多少都会听过或者见过用"双指针"去快速的解题,那么大家有没有想过,为什么要用"双指针"呢?这里的"双指针"和我们平时了解的指针一样吗?

     其实,这里的“双指针”,并不是我们平直所了解的指针(指向地址空间的指针),而是我们想象出来的逻辑指挥棒-------简称“双指针”,这样不仅方便我们的画图,同时能让我们在解题时的时间复杂度和空间复杂度大大降低。

     下面我将通过个几个简单的面试题,来带大家慢慢体会“双指针的魅力”。

     

二、面试题

🍎删除有序数组中的重复项

🔑本题的来源 力扣:删除有序数组中的重复项


🔑题目的大概意思:

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

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

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

       返回 k 。

🔑题目输入:nums[0,0,1,1,1,2,2,3,3,4]

🔑题目输出:5,nums[0,1,2,3,4]

💦题目解析

▶  通常大家见到这种类型的题目,首先肯定会想到的是从前往后重复遍历整个数组,遇到重复的数据删除,让后面的数据往前挪,此时会发现 时间复杂度和空间复杂度比较高。
 

▶ 如果我们定义两个 指挥棒 start 和 end 来指挥数据的变动,此时只需要遍历一次数组即可。当nums[start]==nums[end] 时start就向前挪动,否则 end 向前挪动,将start位置的值赋予个给end位置,这样依次交替转换,直到start遍历整个数组,返回end小标的数组即可。

💦图解分析




💦解题代码

int removeDuplicates(int* nums, int numsSize)
{
    // 自己写
    // 双指针
    // 这里的双指针,是一个指定向的符号,帮助我们更好的处理数组
    int src = 0;
    int dst = 0;
    while(src<numsSize)
    {
        if(nums[src]==nums[dst])
        {
            src++;
        }
        else
        {
            dst++;
            nums[dst]=nums[src];
            src++;
        }
    }
    return dst+1;
}

🍐移除元素

 🔑本题的来源 力扣:移除元素

🔑题目的大概意思:

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

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

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

🔑题目输出:5,nums[0,1,4,0,3]

💦题目解析


▶ 这道题和上一道题目很像,同样定义两个 指挥棒 start 和 end 来指挥数据的变动,当start ==val 时,start向前挪动,否则 nums[start]=nums[end] , end 和 start同时向前挪动。 

💦图解分析

💦解题代码

nt removeElement(int* nums, int numsSize, int val)
{
       // 自己写
       // 使用双指针
       // 定义两个指向符
       int scr=0;
       int dst=0;
       while(scr<numsSize)
       {
           if(nums[scr]!=val)
           {
               nums[dst] = nums[scr];
               dst++;
               scr++;
           }
           else
           {
               scr++;
           }
       }
       return dst;
}

🍑合并两个有序数组 

🔑本题的来源 力扣:合并两个有序数组

🔑题目的大概意思:

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

🔑题目输入:nums1[1,2,3,0,0,0],  m=3     nums2[2,4,6]     n=3

🔑题目输出:nums[1,2,2,3,4,6]


💦题目解析

▶ 根据题目的题意,我们可以设置三个 指挥棒  end1表示nums1有效数据的尾下标,end2表示nums2有效数据的尾下标,end 表示整个nums1数组的尾下标,我们通过比较nums1和nums2有效数据的大小,取大(从后往前比),将大据的数据,重新尾插在nums1上即可。

💦图解分析

🔑    nums2[end2]>nums[end1]   

🔑    nums2[end2]>nums[end1]   



🔑    nums2[end2]>nums[end1]   


🔑    nums2[end2]<nums[end1]   



🔑    nums2[end2]=nums[end1]   




💦解题代码

oid merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    // 自己写
    // 双指针
    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--];
    }
    return nums1;
}


 

三、共勉

一下就是我对“双指针”解题的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对面试题的理解哦,请持续关注我哦!!!!!!!


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

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

相关文章

Python数据分析实战-表连接-merge四种连接方式用法(附源码和实现效果)

实现功能 表连接-merge四种连接方式用法&#xff0c; 将两个pandas表根据一个或者多个键&#xff08;列&#xff09;值进行连接。 实现代码 import pandas as pddf1 pd.DataFrame({key: [a, b, d],data1: range(3)}) print(df1)df2 pd.DataFrame({key: [a, b, c, a, b],dat…

电商商品的前后台类目设计思路,小本本记下来(提供获取京东淘宝商品类目信息API 免费测试)

今天&#xff0c;我们来聊聊商品类目的设计思路。 商品是电商的根基&#xff0c;核心目标是销&#xff0c;也就是卖货。卖货可以多层理解&#xff0c;卖给谁&#xff0c;怎么卖&#xff0c;什么货&#xff0c;其实就是人货场的概念。 我理解的货&#xff0c;不仅是商品层面&a…

使用python requests上传文件

import requests# 指定要上传的文件 files {file: (example.txt, open(1.py, rb))}# 发送POST请求上传文件 response requests.post(http://baidu.com, filesfiles, proxies{http: 127.0.0.1:8080})# 检查响应 if response.status_code 200:print(文件上传成功) else:print(…

连续相同idx 性能为4cycle、不同idx性能为2cycle

mem_bypass结合Tdm 技术&#xff08;通信技术知识积累&#xff1a;TDM - 知乎&#xff09;可以对ram的多拍连续访问。 mem_bypass技术的核心就是在下一次的读前&#xff0c;可以cover 上一次的写。 如下图所示&#xff08;读延时为3cycle&#xff09;&#xff1a; 时序1 &am…

ROS路由器环回脚本,实际在用,只需要更新一个IP地址

实际在用的脚本&#xff0c;需要ros版本较高&#xff0c;低版本可以照着自己改改用&#xff0c;亲测可以。 #取当前拨号ip地址 :global ednsiph [ /ip address get [/ip address find interface"pppoe-out1" ] address ] :global newip [:pick \$ednsiph 0 [:find \…

【chromium】windows 获取源码到本地

从github的chromium 镜像git clone 到2.5G失败了官方说不能,要去 windows_build_instructions vs2017和19都是32位的 vs2022是x64的 vs2022_install You may also have to set variable vs2022_install to your installation path of Visual Studio 2022,

移动中兴ZXHN F6610M光猫拨号密码查询

宽带到期&#xff0c;移动新换了个光猫&#xff0c;型号中兴ZXHN F6610M 光猫默认提供了user账号&#xff0c;但是这个账号基本只有查看权限。 超级账号CMCCAdmin aDm8H%MdA密码并不管用。 问装维&#xff0c;装维不给&#xff0c;曲线救国通过某二手平台查到了。 1.通过超密…

windows操作系统通过浏览器调用本地程序

通过浏览器调用本地程序通常被认为是危险的行为&#xff0c;是被禁止的&#xff0c;但在基于B/S架构的一体机项目中会用到关闭或重启操作系统的操作。此时需要在前端页面有相应的功能按钮并能实现相应的功能。 通过浏览器调用本地应用程序通常需要使用浏览器扩展或本地应用程序…

Transformer(二)—— ResNet(残差网络)

Transformer&#xff08;二&#xff09;—— ResNet&#xff08;残差网络&#xff09; 一、背景1.1 梯度消失/爆炸1.2 网络退化(Degradation) 二、思路2.1 为什么需要更深的网络2.2 理想中的深网络表现 三、实践和实验效果3.1 构造恒等映射&#xff1a;残差学习&#xff08;res…

AIRIOT训练营沈阳站圆满结束|手把手教你搞定物联网应用开发

8月28日-9月1日&#xff0c;由航天科技控股集团有限公司&#xff08;以下简称“航天科技”&#xff09;主办的《AIRIOT物联网平台应用与实战》训练营在沈阳圆满结束&#xff0c;来自上海电机学院、中渝软通信息技术、北京华天机电研究所、北京环卫集团、 中国恩菲 等多家企业…

easypoi模板导出、一张sheet有多个不同表格、带一张或多张echars图表

前言 昨天遇到个有点复杂的excel需要导出&#xff0c;一张sheet里面有两个不同的表格&#xff0c;然后还有几张echars图表要加进去。总共分为上下两个部分&#xff0c;上面是表格一&#xff1b;下面又分为左右两个部分&#xff0c;左边是表格二&#xff0c;右边是几张echars图…

过等保三级的好处是什么?谁能简单说说?

虽然国家已经严格落地执行了等保2.0政策&#xff0c;但还有少数小伙伴对于等保政策不是很了解&#xff0c;有小伙伴问过等保三级的好处是什么&#xff1f;谁能简单说说&#xff1f;这里就来一起聊聊。 过等保三级的好处是什么&#xff1f; 好处1、遵循国家法律法规要求&…

气象观测站:观测原理及优势,助力气象精准预报

随着全球气候变化日益严重&#xff0c;气象观测站在现代社会中的地位愈发凸显。 一、气象观测站的观测原理 气象观测站主要通过各种传感器来测量大气的温度、湿度、风速、风向、气压、太阳辐射等基本气象要素。这些传感器需要具备高精度和高稳定性&#xff0c;以确保观测数据…

DAY02_瑞吉外卖——完善登录功能新增员工员工分页查询启用/禁用员工账号编辑员工信息

目录 1. 完善登录功能1.1 问题分析1.2 思路分析1.3 代码实现1.4 功能测试 2. 新增员工2.1 需求分析2.2 数据模型2.3 程序执行流程2.4 代码实现2.5 功能测试2.6 全局异常处理2.6.1 思路分析2.6.2 全局异常处理器2.6.3 测试 3. 员工分页查询3.1 需求分析3.2 程序执行流程3.2.1 页…

实现在外网SSH远程访问内网树莓派的详细教程

文章目录 如何在局域网外SSH远程访问连接到家里的树莓派&#xff1f;如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar4.2 cpolar进行token认证4.3 配置cpol…

PyTorch深度学习实战(15)——迁移学习

PyTorch深度学习实战&#xff08;15&#xff09;——迁移学习 0. 前言1. 迁移学习1.1 迁移学习基本概念1.2 迁移学习的重要性1.3 ImageNet1.4 迁移学习流程 2. VGG16 架构3. 使用预训练 VGG16 模型实现猫狗分类小结系列链接 0. 前言 迁移学习( Transfer Learning )是一种利用从…

利用evo将kitti数据集真值轨迹由kitti格式转为tum格式

&#xff08;1&#xff09;首先是序列对应问题&#xff1a; 00: 2011_10_03_drive_0027 01: 2011_10_03_drive_0042 02: 2011_10_03_drive_0034 03: 2011_09_26_drive_0067 04: 2011_09_30_drive_0016 05: 2011_09_30_drive_0018 06: 2011_09_30_drive_0020 07: 2011_09_30_dr…

精品基于NET实现的期刊订购管理系统

《[含文档PPT源码等]精品基于NET实现的期刊订购管理系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发软件&#xff1a;VS 2017 &#xff08;版本2017以上即可&#xff0c;不能低于2017&#xff09; 数…

12.示例程序(定时器定时中断定时器外部时钟)

目录 定时中断和时钟源选择相关库函数使用 1.定时器初始化配置 2.参数&#xff08;PSC、ARR等&#xff09;更改函数&#xff08;在程序运行过程中修改&#xff09; 3.使用定时器库函数的一些细节 定时器定时中断实例 定时器外部时钟选择 知识点get&#xff1a; 滤波器工作…

印尼市场TikTok攻略:如何利用海外网红引领品牌营销?

随着社交媒体的迅速崛起&#xff0c;营销策略也在不断演变&#xff0c;其中TikTok作为一个全球热门的短视频平台&#xff0c;为企业在国际市场上推广产品和服务提供了新的机会。印尼作为东南亚最大的国家之一&#xff0c;拥有庞大的互联网用户群体&#xff0c;为品牌在TikTok上…