算法篇1:双指针思想的运用(1)--C++

一.算法解析

双指针,顾名思义就是两个指针,常见的算法中,我们可以看到两种:

1.对撞指针:一般用于顺序结构,也称为左右指针。

  • 对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最右端开始,然后逐渐往中间逼近。
  • 对撞指针的中终止条件是两个指针相遇后者错开(也有可能在内部找到结果后就直接返回了结果)。总的来说就是:
    • left == right
    • left > right

 2.快慢指针:又被称之为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上移动。

这样的结构在环形数组上非常有用·。

其实不单单是环形链表和数组,我们再研究任何出现循环往复的情况是,都可以使用快慢指针的思想。

快慢指针的视线方法有很多种,最常用的一种就是:
在一个循环中,每一次让慢指针向后移动一位,快指针向后移动两位,实现两个指针,一快一慢。

二、题目解析 

1.移动0 

题目链接: 283. 移动零 - 力扣(LeetCode)

这道题的要求十分的简单,我们可以看到,题目的要求需要我们保持非0元素的相对位置不变。

我们就可以使用快慢指针来解决这道题。

首先我们可以通过定义两个下标位置来模拟快慢指针,我们可以怎样来定义呢?

本题目中,我们可以用一个cur指针来烧苗整个数组,另一个指针dest指针来记录非0元素序列的最后一个元素。根据cur在扫描的过程中,遇到的不同的情况,分类处理,实现数组的划分。

通过上面的思想,我们就可以着手实现代码了:

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

2. 复写0

题目链接: 1089. 复写零 - 力扣(LeetCode)

 

这道题,想要在原地复写,我们还是通过双指针的算法思想来实现:

1.首先我们要找到最后一个需要复写的元素的位置:

可以在扫描数组的时候直接判断数组元素的值,为非0元素就直接领cur++,dest++;

是0就直接让deSt += 2 

直到最后 dest >= n - 1为止,在这里,我们还需要注意处理边界情况,如下图这种情况:

 

解决了上面的问题之后,理清了思想之后,我们可以 着手实现代码了:

class Solution {
public:void duplicateZeros(vector<int>& arr) {//首先我们找到最后一个需要腹泻的元素位置:int cur = 0, dest = -1;int n = arr.size();while(cur < n){if (arr[cur])dest++;elsedest += 2;if (dest >= n - 1)break;cur ++;}//处理边界情况:if (dest > n - 1){dest -= 2;arr[arr.size() - 1] = 0;cur--;}while (cur >= 0){if (arr[cur]){arr[dest--] = arr[cur];}else{arr[dest--] = 0;arr[dest--] = 0;}cur--;}}
};

3. 快乐数

题目链接:202. 快乐数 - 力扣(LeetCode)

首先分析一下题意

 为了方便叙述:将【对于一个正整数,每一次将该数替换为=为他每一个位置上的数字的平方和】将这个操作记为x;

题目告诉我们,当我们不断地重复x的操作时,计算一定会进入死循环,死的方式有多种:

一:一直在1中死循环即: 1--》1--》1--》1.....

二:在历史的数据中死循环,但始终得不到一!

由于上面的两种情况只会出现一种,因此,只要我们能确定循环是在【情况1】中进行,还是子啊【情况二】中进行,就能得到结果

这里我们简单证明一下,为什么会只得到两种结果:

  • a.经过一次变化的最大值 9 ^ 2 * 10 = 81(这种情况指的就是最大的一个数,9999999999),也就是说,变化的区间就在【1,810】;
  • b.根据鸽巢原理:一个数变化811次之后必然会形成一个循环。
  • c.因此我们可以使用快慢指针来实现。

有了上面的知识基础,我们现在开始写代码:

class Solution {
public:int sumbit(int n){int sum = 0;while (n){sum += pow(n % 10, 2);n /= 10;}return sum;}bool isHappy(int n) {int fast = sumbit(sumbit(n));int slow = sumbit(n);while (slow != fast){fast = sumbit(sumbit(fast));slow = sumbit(slow);}if (slow == 1)return true;elsereturn false;}
};

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

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

相关文章

比较搜索难度曲线5s1-4和4s1

在行列可自由变换的条件下&#xff0c;平面上的5点结构只有34个,4点结构有16个 (A,B)---6*n*2---(0,1)(1,0) 让B全是0。当收敛误差为7e-4&#xff0c;收敛199次取迭代次数平均值。让隐藏层节点数n分别为10&#xff0c;15&#xff0c;20&#xff0c;25&#xff0c;30&#xff…

C(十四)while、for、do-while循环综合(一)

uu们&#xff0c;小弟我本科在读&#xff0c;文章我会一直坚持更新下去&#xff0c;包括但不限于C初阶、C进阶、数据结构、C、Linux、MySQL、项目、QT开发、各种算法&#xff08;之后会持续更新&#xff09;&#xff0c;并且站在小白的视角尽可能通俗易懂地把这些写出来&#x…

【Android】获取备案所需的公钥以及签名MD5值

目录 重要前提 获取签名MD5值 获取公钥 重要前提 生成jks文件以及gradle配置应用该文件。具体步骤请参考我这篇文章&#xff1a;【Android】配置Gradle打包apk的环境_generate signed bundle or apk-CSDN博客 你只需要从头看到该文章的配置build.gradle&#xff08;app&…

25重庆长安深蓝控制器开发面试经验 深蓝最常见面试问题总结

【面试经历】 秋招气氛组选手的第一场面试,9.17网申,9.24电话约面,9.26线上面试。问得很细,全长约1个小时 1. 自我介绍、项目介绍 2.项目细节,遇到了哪些困难;有没有PCB设计经验DC-DC芯片选型,电源噪声的原因、怎么消除、 3.画BUCK和BOOST拓扑图,讲原理 4.了解MCU的主…

西电25考研 VS 24考研专业课大纲变动汇总

01专业课变动 西安电子科技大学专业课学长看到953网络安全基础综合变为 893网络安全基础综合&#xff0c;这是因为工科要求都必须是8开头的专业课&#xff0c;里面参考课本还是没变的&#xff0c;无非就是变了一个名字 对于其他变动专业课也是同理的 02专业课考纲内容变化 对于…

uniapp中检测应用更新的两种方式-升级中心之uni-upgrade-center-app

uniapp一个很是用的功能&#xff0c;就是在我们发布新版本的app后&#xff0c;需要提示用户进行app更新&#xff0c;并告知用户我们新版的app更新信息&#xff0c;以使得用户能及时使用上我们新开发的功能&#xff0c;提升用户的实用度和粘性。注意:这个功能只能在app端使用 效…

创建django项目时,不同的编译类型有什么区别

这里主要提及的是 project venv 和 Custom environment 两种类型。 简单来说&#xff0c;project venv 是Python 3.3及以上版本中自带的虚拟环境管理工具&#xff0c;使用venv可以为每个项目创建一个独立的环境&#xff1a;python -m venv myprojectenv &#xff08;项目名后e…

【3D目标检测】激光雷达和相机联合标定(一)——ROS同步解包

ROS同步解包 引言1 鱼香ROS一键安装ros-docker脚本&#xff1a;2 指定目录映射3 数据解包3.1 解包脚本3.2 依赖安装3.3 运行脚本&#xff0c;解包 引言 总结步骤如下&#xff1a; 采集同步数据&#xff1a;ROS录制&#xff08;推荐&#xff09;&#xff0c;或者代码同步触发采…

如何使用工具删除 iPhone 上的图片背景

在 iPhone 上删除背景图像变得简单易行。感谢最近 iOS 更新中引入的新功能。如今&#xff0c;iOS 用户现在可以毫不费力地删除背景&#xff0c;而无需复杂的应用程序。在这篇文章中&#xff0c;您将学习如何使用各种方法去除 iPhone 上的背景。这可确保您可以选择最适合您偏好的…

通信工程学习:什么是IP网际协议

IP&#xff1a;网际协议 IP网际协议&#xff08;Internet Protocol&#xff0c;简称IP&#xff09;是整个TCP/IP协议栈中的核心协议之一&#xff0c;它负责在网络中传送数据包&#xff0c;并提供寻址和路由功能。以下是对IP网际协议的详细解释&#xff1a; 一、对IP网际协议的…

哈尔滨自闭症学校寄宿条件与优势解析

自闭症儿童的希望之光&#xff1a;广州星贝育园寄宿制学校深度解析 在当今社会&#xff0c;自闭症儿童作为一群需要特别关注和照顾的群体&#xff0c;其教育与康复问题日益受到社会各界的重视。自闭症儿童不仅需要专业的康复训练&#xff0c;还需要一个稳定、温馨且充满爱的环…

Java:插入排序

目录 排序的概念 插入排序 直接插入排序 哈希排序 排序的概念 排序&#xff1a;所谓的排序&#xff0c;就是使一串记录&#xff0c;按照某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个…

【设计模式-解释模式】

定义 解释器模式是一种行为设计模式&#xff0c;用于定义一种语言的文法&#xff0c;并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类&#xff0c;使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…

Redis中String类型的常用命令(append,getrenge,setrange等命令)

Redis----String命令 前言.常见的String存储类型. 常见命令1. set 命令2. get 命令3. mget命令与mset命令4. setnx命令5. setex与psetex命令6. incr与incrby与incrbyfloat命令7. decr与decrby命令8. append命令9. getrange和setrange命令10. strlen命令. 前言. 常见的String存…

关于Generator,async 和 await的介绍

在本篇文章中我们主要围绕下面几个问题来介绍async 和await &#x1f370;Generator的作用&#xff0c;async 及 await 的特点&#xff0c;它们的优点和缺点分别是什么&#xff1f;await 原理是什么&#xff1f; &#x1f4c5;我的感受是我们先来了解Generator&#xff0c;在去…

【AI学习】Mamba学习(二):线性注意力

上一篇《Mamba学习&#xff08;一&#xff09;&#xff1a;总体架构》提到&#xff0c;Transformer 模型的主要缺点是&#xff1a;自注意力机制的计算量会随着上下文长度的增加呈平方级增长。所以&#xff0c;许多次二次时间架构&#xff08;指一个函数或算法的增长速度小于二次…

linux下yum安装时出现Loaded plugins: fastestmirror的解决办法

一、centos7修改源 在CentOS 7中&#xff0c;修改系统软件源可以通过编辑/etc/yum.repos.d/目录下的.repo文件来实现。以下是一个基本的步骤和示例代码&#xff0c;用于将默认的软件源修改为阿里云的源。 备份当前的CentOS-Base.repo文件&#xff1a; sudo cp /etc/yum.repos.…

PD协议芯片ECP5701+充电管理芯片+升压芯片搭配应用TYPE-C口充电及升压供电系统

以往的电子设备需要有专门的电源适配器来供电&#xff0c;不仅需要大家区分不同设备的充电器&#xff0c;还要专门找地方来放置&#xff0c;还给用户带来了诸多不便。然而&#xff0c;TYPE-C接口&#xff0c;全称USB Type-C&#xff0c;迅速取代了传统的USB接口&#xff0c;成为…

[linux 驱动]input输入子系统详解与实战

目录 1 描述 2 结构体 2.1 input_class 2.2 input_dev 2.4 input_event 2.4 input_dev_type 3 input接口 3.1 input_allocate_device 3.2 input_free_device 3.3 input_register_device 3.4 input_unregister_device 3.5 input_event 3.6 input_sync 3.7 input_se…

排序算法剖析

文章目录 排序算法浅谈参考资料评价指标可视化工具概览 插入排序折半插入排序希尔排序冒泡排序快速排序简单选择排序堆排序归并排序基数排序 排序算法浅谈 参考资料 数据结构与算法 评价指标 稳定性&#xff1a;两个相同的关键字排序过后相对位置不发生变化时间复杂度空间复…