双指针--优选算法

个人主页:敲上瘾-CSDN博客

个人专栏:游戏、数据结构、c语言基础、c++学习、OJ题

前言:

        该篇文章我们主要来学习的是双指针算法,对于该类算法我们可以直接来做题,从题中去感知该算法的魅力,最后再从题中做总结。接下来我准备了3道题,每道题会分为三个步骤讲解,分别是题目解析、算法原理、代码编写去讲解,最后再做总结。

目录

一、移动零

1.题目解析

2.算法原理

3.代码编写

二、盛水最多的容器

1.题目解析

2.算法原理

(1)、解法一(暴力枚举):

(2)、解法二(利用单调性):

3.代码编写

三、快乐数

1.题目解析

2.算法原理

3.代码编写

四、总结


一、移动零

1.题目解析

        该题的题目要求把数组中的零全部移到右边,并且保持非零元素的相对位置不变,这里举例了个例子[ 0,1,0,3,12],移动后[1,3,12,0,0],原本非零元素的数据顺序是1在前2其次最后是12,修改后的数据同样保持1在前2其次最后是12的顺序,只是把零元素移动到最后面。

2.算法原理

        在我们在讲算法原理的时候要注意一个前提条件:不复制数组

        该题我在这里把它归类为数组划分的类型,也就是给定一个规则,然后依这个规则把数组里的元素划分出不同的区间,如:此问题可以理解为把混乱的数据划分为零区间与非零区间,区间与区间之间可以用指针把它们分开。

注意这里说的指针并不是真的指针,而是数组的下标,双指针只是一种思想。

        一个指针可以分两个区间,但是刚开始元素是混乱的,并不能一次性把它处理完,所以还需要一个区间来存放待处理的元素,那么就需要用两个指针来把区间分开,如下:

        这里可以让p1指向非零区间的最后一个元素,p2指向待处理区间的第一个元素,这样的话如果p2遍历到非零元素的话就可以直接与++p1后交换元素。而如果p2遍历到零元素的话并不需要做任何改动,p2继续遍历。那么随着p2遍历结束整数组就只剩下非零区间和零区间,而且非零元素的相对顺序依旧不变。这样这个算法就算完成了

3.代码编写

class Solution {
public:void moveZeroes(vector<int>& nums) {int p1=-1,p2=0;while(p2!=nums.size()){if(nums[p2]!=0)swap(nums[++p1],nums[p2]);p2++;}}
};

涉及用双指针划分数组的还有快速排序的核心部分,如下:

二、盛水最多的容器

1.题目解析

        该题目的意思是给一个数组,数组的下标代表柱子的横坐标,下标对应的元素代表着高度,选择两个柱子,两坐标相差的值作为容器长度,而选纵坐标最小的作为容器高度。然后构成一个容器,宽乘以高表示容器的储水量,如下:下标3和7的柱子的储水量。

2.算法原理

(1)、解法一(暴力枚举):

        该题最容易想到也是最容易理解的应该就是暴力枚举了,直接用两层循环一一枚举并更新容器最大容量。时间复杂度为O(N^2),效率比较低在这里就不再多讲我们直接来看解法二。

(2)、解法二(利用单调性):

        因为坐标是从左往右单调增的,所以首先选定围成宽度最宽的两个柱子,然后记录它们容器容量,如下图所示:

        现在围成的容量并不一定是最大的,但通过观察很容易发现如果我们把right往左挪动容器容量必然会减小,因为right往左挪动后宽度是必然会减小的,而根据题目要求高度只能取较小那个,即取的高度小于等于1。所以我们可以根据这个性质减少不必要的枚举,只让指向较小的那个元素1的left往右移,然后记录容量。

        通过以上发现的性质我们就可以设计算法了,首先用left指针指向0下标,right指针指向最后一个元素的下标,然后计算并更新最大容量。如果left指向元素较小那么left右移,如果right指向元素较小那么right左移,然后计算并更新最大容量。循环进行直到left与right相遇,最后返回最大容量。

3.代码编写

class Solution {
public:int maxArea(vector<int>& height) {int sum=0,left=0,right=height.size()-1;while(left!=right){sum=max(sum,(right-left)*min(height[left],height[right]));if(height[left]<height[right]) left++;else right--;}return sum;}
};

三、快乐数

1.题目解析

        该题目的意思是给定一个数然后把它的各个位数平方相加生成一个新的数,然后再次对这个新的数的各个位数的平方相加生成新的数,循环往复操作直到这个数变成1返回true或者根本变不到1返回false。如上19,它的个位数的平方加十位数的平方得到新的数82,继续对82进行同样的操作直到能够判断它是否能变为1。

2.算法原理

        该题的重难点就在于如何判断该数能不能变为1,在题目中有一个要点:重复该操作可能使这个数变为1,也可能进入无限循环。而这个数变到1后继续操作也是无限的循环

出现循环我们就很容易想到用快慢指针处理追击问题,这个思想这里也同样适用,把每次操作当做指针移动。

        把两个指针放入循环内,单趟循环内快指针fast操作两次,慢指针slow操作一次,那么当数据进入循环后,fast必然会与slow相遇(即数据相等),如果此位置为1那么这个数就能变成1返回true,如果不是则不能变成1返回false。

3.代码编写

class Solution {
public:int _isHappy(int m){int sum=0;while(m){sum+=(m%10)*(m%10);m/=10;}return sum;}bool isHappy(int n) {int fast=n,slow=n;do{fast=_isHappy(fast);slow=_isHappy(_isHappy(slow));}while(fast!=slow);return fast==1;}
};

四、总结

        1、以上三道题分别对应数组划分、数据的单调性、数据的循环,在以后涉及这种类型题的时候都可以从双指针方向去考虑。

        2、对于能使用暴力枚举解决的问题也可以考虑使用双指针去降低时间复杂度提高效率。

        3、通常所说的双指针算法只是一种思想并不是用真的使用指针。

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

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

相关文章

Elasticsearch Suggesters API详解与联想词自动补全应用

Elasticsearch Suggesters API详解与联想词自动补全应用 引言Elasticsearch Suggesters1. Term Suggester实现步骤示例 2. Phrase Suggester示例 3. Completion Suggester创建映射和插入数据查询示例 4. Context Suggester示例 Completion Suggester1. 工作原理2. 使用流程3. 使…

东软 在大健康路上“笨鸟先飞”

若不是东软医疗引入“国家队”通用技术集团作为其最重要的战略投资人&#xff0c;恐怕很多人并不会留意东软“蛰伏”在大健康的赛道上&#xff0c;已有30年。 1997年的一天&#xff0c;沈阳高新技术产业开发区的东大软件园里&#xff0c;创立东软不过6年时间的刘积仁思量着眼前…

并发性服务器

同一时刻能处理多个客户端 多进程&#xff1a; int init_tcp_ser(const char *ip,unsigned short port) {int sockfd socket(AF_INET,SOCK_STREAM,0);if(-1 sockfd){perror("fail socket");return -1;}struct sockaddr_in ser;ser.sin_family AF_INET;ser.sin_por…

tomcat在eclipse中起动成功,无法访问tomcat主页

最近通过geoserver的war包将&#xff0c;geoserver服务部署到了tomcat&#xff0c;发现在eclipse中启动服务后&#xff0c;无法访问localhost&#xff1a;8080主页&#xff0c;geoserver主页&#xff1a;localhost:8080/geoserver/web同样也无法访问。 只需要双击下面的server…

【生成模型系列(初级)】自编码器——深度学习的数据压缩与重构

【通俗理解】自编码器——深度学习的数据压缩与重构 第一节&#xff1a;自编码器的类比与核心概念 1.1 自编码器的类比 你可以把自编码器想象成一个“智能压缩机”&#xff0c;它能够把输入的数据&#xff08;比如图片&#xff09;压缩成一个更小的表示&#xff08;编码&#…

MacOS使用FileZilla通过ssh密钥文件连接远程服务器(已解决)

需求描述 mac电脑,使用filezilla通过FTP连接远程服务器,使用ssh密钥文件代替密码。 版本信息 MacOS:Sonoma 14.5 M3芯片 FileZilla:3.66.5 在这里插入图片描述 连接 1. 创建站点 打开filezilla工具,右上角选择“文件 -> 站点管理器”,打开站点管理器弹窗。 2.…

仿华为车机功能之--修改Launcher3,实现横向滑动桌面空白处切换壁纸

本功能基于Android13 Launcher3 需求:模仿华为问界车机,实现横向滑动桌面空白处,切换壁纸功能(本质只是切换背景,没有切换壁纸)。 实现效果: 实现思路: 第一步首先得增加手势识别 第二步切换底图,不切换壁纸是因为切换壁纸动作太大,需要调用到WallpaperManager,耗…

StringTable

10.1. String的基本特性 String&#xff1a;字符串&#xff0c;使用一对""引起来表示String声明为final的&#xff0c;不可被继承String实现了Serializable接口&#xff1a;表示字符串是支持序列化的。String实现了Comparable接口&#xff1a;表示string可以比较大小…

六. 部署分类器-trt-engine-explorer

目录 前言0. 简述1. 案例运行2. 补充说明3. engine分析结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第六章—部署分类器&#xff0c;一起来学习 trt-engine…

更新RK3588开发板的rknn_server和librknnrt.so【这篇文章是RKNPU2从入门到实践 --- 【5】的配套文章】

作者使用的平台有&#xff1a; 一台装有Windows系统的宿主机&#xff0c;在该宿主机上装有Ubuntu 20.04虚拟系统&#xff1b; 瑞芯微RK3588开发板&#xff0c;开发板上的系统为Ubuntu22.04系统&#xff1b; 更新板子的 rknn_server 和 librknnrt.so&#xff0c;rknn_server 和…

借鉴腾讯系统架构从小到大的过程 - 如何做好一个系统设计?不限于(慧哥)慧知开源充电桩平台

推荐一套企业级开源充电桩平台&#xff1a;完整代码包含多租户、硬件模拟器、多运营商、多小程序&#xff0c;汽车 电动自行车、云快充协议&#xff1b;——(慧哥)慧知开源充电桩平台&#xff1b;https://liwenhui.blog.csdn.net/article/details/134773779?spm1001.2014.3001…

倒计时1天!每日一题,零基础入门FPGA

近年来&#xff0c;FPGA工程师凭借着远高于传统软件开发工程师的薪酬&#xff0c;吸引了越来越多的人转行。 然而&#xff0c;入门FPGA并非易事。你需要有清晰的学习路线&#xff0c;包括它的基本组成&#xff08;如可编程逻辑块CLB、输入输出块IOB、内部连线资源等&#xff0…

JS设计模式之“分即是合” - 建造者模式

引言 当我们在进行软件编程时&#xff0c;常常会遇到需要创建复杂对象的情况。这些对象可能有多个属性&#xff0c;属性之间存在依赖关系&#xff0c;或需要按照特定的骤来创建。在这种情况下&#xff0c;使用建造者模式&#xff08;Builder Pattern&#xff09;可以提供一种活…

selenium启动总报错 WebDriverManager总是异常

我的环境用这个自动管理驱动的工具 WebDriverManager 总是报错 尝试过很多方法都没有&#xff0c;只好手动指定浏览器的位置 System.setProperty("webdriver.chrome.driver", "C:\\Users\\27224\\.cache\\selenium\\chromedriver\\win64\\128.0.6613.84\\chrome…

HTTP 协议详解

0x01&#xff1a;HTTP 协议简介 HTTP&#xff08;HyperTextTransferProtocol&#xff0c;超文本传输协议&#xff09;&#xff0c;是一个工作在应用层的协议&#xff0c;它通常运行在 TCP 之上&#xff0c;它指定了客户端以什么样的格式发送信息&#xff0c;以及得到什么样的响…

uniapp微信小程序开发测试获取手机号码

先申请测试号 注意认证但是没有完全认证不要试测试号解密如下 总结我自己的两大坑 1.官网的WXBizDataCrypt需要导入crypto要提前下载但是试了很多次没有效果重新编写这个。将crypto库换成crypto-js库 2.我一直在尝试用下有下面这个界面的测试号不行获取不到用户的code还是啥忘记…

基于SpringBoot+Vue+MySQL的社区维修平台

系统背景 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于社区维修平台所牵扯的管理及数据保存都是非常多的&#xff0c;例如住户管理、社区公告管理、维修工管理、维修订单管理、接单信息管理、订单信息管理、在线沟通管理、举报信息管理、留言板管理、系统管理等…

记Spring HTTP Invoker远程调用的使用(二)基于Servlet方式,配置servlet映射url-pattern实现

目录 前言 一、概念 二、代码实现 1. 服务端实现 2. 客户端实现 前言 本篇接上一篇记Spring HTTP Invoker远程调用的使用&#xff08;一&#xff09;基于Url映射方式&#xff0c;DispatcherServlet统一处理实现-CSDN博客https://blog.csdn.net/u011529483/article/details/141…

搭建高可用OpenStack(Queen版)集群(九)之部署nova计算节点

一、搭建高可用OpenStack&#xff08;Queen版&#xff09;集群之部署计算节点 一、部署nova 1、安装nova-compute 在全部计算节点安装nova-compute服务 yum install python-openstackclient openstack-utils openstack-selinux -y yum install openstack-nova-compute -y 若yu…

【如何在MacOS升级ruby版本】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…