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

一、前言

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

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

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

     

二、面试题

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

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


🔑题目的大概意思:

给你一个 升序排列 的数组 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.rhkb.cn/news/129196.html

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

相关文章

永辉上半年净利润扭亏为盈,是“科技重启”的功劳吗?

你有多久没逛超市了&#xff1f;你记忆中的超市是怎样的&#xff1f;现在逛超市的原因又是什么&#xff1f; 其实&#xff0c;对于很多年轻人来说&#xff0c;现在的“快递点”就是“新时代超市”。而传统“超市”“大卖场”被新型超市、电商抢走不少人流量后&#xff0c;逐渐…

个人主页网站动态星空背景源码(带后台版本)

动态星空背景个人主页网站源码是一种用于创建个人主页的开源项目。它具有一个令人印象深刻的动态星空背景&#xff0c;为用户提供了一个独特而吸引人的网页设计。此源码还包含一个后台版本&#xff0c;使用户能够轻松管理和更新他们的个人主页内容。 通过该源码&#xff0c;用…

亿发软件:智慧门店商超系统,2023新零售POS数字运营一体化管理

2023年9月6日&#xff0c;山东济宁一家超市因为酸奶价格标签错误而引发了广泛关注。标签原本显示几十个人为9.9元&#xff0c;但特价销售价却标为10元。这一小小的错误却在社交媒体上引发了轩然大波&#xff0c;让超市一度处于舆论的风口浪尖。超市工作人员回应&#xff0c;表示…

华为云云耀云服务器L实例评测 | 华为云云耀云服务器L实例使用教学

文章目录 前言一、登录华为云二、创建云服务器L实例三、登录云服务器L实例四、使用云服务器L实例后记 前言 华为云是中国领先的云计算服务提供商之一&#xff0c;旗下的云耀云服务器是一种高性能、高可靠性、灵活可扩展的云服务器。 下面&#xff0c;我将为大家介绍华为云云耀云…

【算法】希尔 (Shell) 排序 详解

希尔排序 详解 希尔排序代码实现 排序&#xff1a; 排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a; 假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#x…

MySQL学习问题记录

文章目录 MySQL学习问题记录1、查询记录自动根据id排序&#xff1f; MySQL学习问题记录 1、查询记录自动根据id排序&#xff1f; step1&#xff1a;建表 表项信息&#xff1a; 写入数据顺序id为10 2 7 1。查寻时返回记录顺序为1 2 7 10&#xff1f; 更新一条数据后仍然按照…

【AIGC专题】Stable Diffusion 从入门到企业级实战0403

一、前言 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第03节&#xff0c; 利用Stable Diffusion ControlNet Canny模型精准控制图像生成。本部分内容&#xff0c;位于整个Stable Diffusion生态…

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

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

时序预测 | MATLAB实现ICEEMDAN-iMPA-BiLSTM时间序列预测

时序预测 | MATLAB实现ICEEMDAN-iMPA-BiLSTM时间序列预测 目录 时序预测 | MATLAB实现ICEEMDAN-iMPA-BiLSTM时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 ICEEMDAN-iMPA-BiLSTM功率/风速预测 基于改进的自适应经验模态分解改进海洋捕食者算法双向长短期记忆…

C语言深入理解指针(非常详细)(五)

目录 回调函数qsort使用举例qsort函数的模拟实现sizeof和strlen的对比sizeofstrlensizeof和strlen的对比一道关于sizeof的题 回调函数 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指…

Python小知识 - Python装饰器

Python装饰器 在Python中&#xff0c;装饰器是一个特殊的函数&#xff0c;可以将其他函数包装在装饰器函数中&#xff0c;并且将被包装的函数作为参数传递给装饰器函数。 使用装饰器的好处是可以自动在被包装的函数前后执行一些额外的代码&#xff0c;比如在函数执行前后打印日…

ClickHouse的Join算法

ClickHouse的Join算法 ClickHouse是一款开源的列式分析型数据库&#xff08;OLAP&#xff09;&#xff0c;专为需要超低延迟分析查询大量数据的场景而生。为了实现分析应用可能达到的最佳性能&#xff0c;分析型数据库&#xff08;OLAP&#xff09;通常将表组合在一起形成一个…

电脑文件批量重命名:高效操作技巧

随着时间的推移&#xff0c;我们积累的文件和文件夹数量越来越多&#xff0c;需要对它们进行合理的命名和管理&#xff0c;以便更方便地查找和利用。而文件批量重命名功能可以帮助我们更高效地管理文件夹。下面介绍五种方式&#xff0c;帮助你更好地利用文件批量重命名工具&…

ADASAPA场景设计分享

相信大家都对于ADAS与APA这两个车机功能都不陌生&#xff0c;对其场景设计过程可能并不是很清楚。今天小怿就跟大家分享一下自己的设计心得。 首先&#xff0c;我们来看一下ADAS和APA的定义&#xff0c;以便我们更好地了解其功能和应用场景。 ADAS定义 ADAS的全称叫Advanced …

Nosql数据库服务之redis

Nosql数据库服务之redis 一图详解DB的分支产品 Nosql数据库介绍 是一种非关系型数据库服务&#xff0c;它能解决常规数据库的并发能力&#xff0c;比如传统的数据库的IO与性能的瓶颈&#xff0c;同样它是关系型数据库的一个补充&#xff0c;有着比较好的高效率与高性能。 专…

视频讲解|3014 含分布式电源的配电网优化重构

目录 1 主要内容 2 讲解视频链接 3 部分程序 1 主要内容 该视频为程序目录中编号1034的讲解内容&#xff0c;该程序的链接为配电网优化重构matlab智能算法&#xff0c;本次重点讲解了基本环矩阵原理以及代码两步实现过程、如何利用基本环向量去创造可行解、粒子群优化过程、…

list【2】模拟实现(含迭代器实现超详解哦)

模拟实现list 引言&#xff08;实现概述&#xff09;list迭代器实现默认成员函数operator* 与 operator->operator 与 operator--operator 与 operator!迭代器实现概览 list主要接口实现默认成员函数构造函数析构函数赋值重载 迭代器容量元素访问数据修改inserterasepush_ba…

Kafka3.0.0版本——消费者(消费者组详细消费流程图解及消费者重要参数)

目录 一、消费者组详细消费流程图解二、消费者的重要参数 一、消费者组详细消费流程图解 创建一个消费者网络连接客户端&#xff0c;主要用于与kafka集群进行交互&#xff0c;如下图所示&#xff1a; 调用sendFetches发送消费请求&#xff0c;如下图所示&#xff1a; (1)、Fet…

【halcon】halcon字符识别——OCR

前言 OCR&#xff08;Optical Character Recongnition&#xff09;光学字符识别。 halcon 的OCR&#xff0c;提供了几种方式&#xff0c;我们应该如何选择&#xff1f; 自动文本阅读器&#xff08;find_text&#xff09;手动文本阅读器&#xff08;find_text&#xff09;自己…

Android USB电源管理

The USB peripheral detects the lack of 3 consecutive SOF packets as a suspend request from the USB host. 1 驱动shutdown顺序 系统关机或重启的过程中&#xff0c;会调用设备驱动的shutdown函数来完成设备的关闭操作&#xff0c;有需要的设备可以在驱动中定义该函数。其…