算法篇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.rhkb.cn/news/439347.html

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

相关文章

Yolov8轻量级网络改进GhostNet

1,理论部分 由于内存和计算资源有限,在移动设备上部署卷积神经网络 (CNN) 很困难。我们的目标是通过利用特征图中的冗余,为 CPU 和 GPU 等异构设备设计高效的神经网络,这在神经架构设计中很少被研究。对于类 CPU 设备,我们提出了一种新颖的 CPU 高效 Ghost (C-Ghost) …

Mysql:数据库和表增删查改基本语句

一、数据库操作 1&#xff09;、数据库创建 创建数据库本质就是创建一个目录&#xff08;ubuntu&#xff0c;创建的目录文件存放在/var/lib/mysql&#xff09;&#xff1b;后续创建表本质就是在该目录下创建文件&#xff08;不同存储引擎&#xff0c;会创建的文件数目是不同的…

PASCAL VOC 2012数据集 20类物体,这些物体包括人、动物(如猫、狗、鸟等)、交通工具(如车、船、飞机等)以及家具(如椅子、桌子、沙发等)。

VOC2012数据集是PASCAL VOC挑战赛官方使用的数据集之一&#xff0c;主要包含20类物体&#xff0c;这些物体包括人、动物&#xff08;如猫、狗、鸟等&#xff09;、交通工具&#xff08;如车、船、飞机等&#xff09;以及家具&#xff08;如椅子、桌子、沙发等&#xff09;。每个…

计算机网络:物理层 —— 物理层下的传输媒体

文章目录 传输媒体导向性媒体同轴电缆双绞线光纤光纤分类中心波长光纤规格光纤的优缺点 非导向性媒体ISM 频段无线电波微波激光红外线可见光 传输媒体 传输媒体是计算机网络设备之间的物理通路&#xff0c;也称为传输介质或传输媒介&#xff0c;并不包含在计算机网络体系结构中…

github项目——系统设计入门

今天的github趋势&#xff0c;有几个项目印象感觉很有意思&#xff0c;之后可能会用的上&#xff0c;记录一下 系统设计入门 书籍教程类项目&#xff0c;有中文文档&#xff0c;刚好需要。 https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md…

Linux之实战命令26:timeout应用实例(六十)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

postgresql|数据库|postgis编译完成后的插件迁移应该如何做(postgis插件最终章)

一、 本文的写作理由 postgis插件一般是编译安装&#xff0c;编译安装的原因是可以选择自己喜欢的版本&#xff0c;但编译的难度也是比较高的&#xff0c;因为有各种依赖&#xff0c;依赖之间还有依赖&#xff0c;非常容易形成依赖循环&#xff0c;因此&#xff0c;失败率是比…

libevent框架、带缓冲区事件bufferevent的使用

1.简介 特点 源码包安装 2.libevent框架 创建event_base 创建添加事件 循环监听事件满足 释放event_base 相关函数了解 3.常规事件event 未决与非未决 使用fifo的读写 4.带缓冲区事件bufferevent bufferevent A.服务器创建监听器 C.给读写缓冲区设置回调 D.禁用…

基于spring boot的篮球论坛系统

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

【Unity踩坑】使用内购时获取Google Play license key

在Unity中使用了IAP&#xff08;内购&#xff09;后&#xff0c;需要设置Google Play license key。 这个key需要在Google Play Console中&#xff08;https://play.google.com/console&#xff09;&#xff0c;找到相应的应用&#xff0c;在左侧“创收设置”里可以找到license…

电脑失声,一招搞定

早已习惯了Edge浏览器的“大声朗读”功能&#xff0c;今天值班&#xff0c;值班室用的两台电脑只配有耳机&#xff0c;没有音箱&#xff0c;顿时感觉不适。 先找了一个带功放的老音箱&#xff0c;发现少了电箱到功放的音频线。 一顿搜索&#xff0c;在找到音频线的同时&#…

Linux·进程概念(下)

1. 进程优先级 优先级就是获得某种资源的先后顺序&#xff0c;因为CPU资源是有限的&#xff0c;因此各个进程之间要去争取CPU的资源。 那么针对Linux操作系统下的PCB中&#xff0c;也就是task_struct结构体中&#xff0c;使用了int类型的变量记录了每个进程的优先级属性&#x…

【Xcode Command Line Tools】安装指南

安装指令 xcode-select --install安装 完成安装 验证 $ xcode-select -p /Library/Developer/CommandLineTools

Python机器视觉:01- 利用列表和切片操作 - 做一个弧线和图片相交的mask区域

前言&#xff1a; Python的列表处理&#xff0c;在机器视觉中经常被用到&#xff0c;这里结合基本的概念机器视觉实践案例&#xff0c;成文如下&#xff1a; 本身将实现一个&#xff0c;弧线的mask填充&#xff1a;这个mask是我的一个天文项目的应用&#xff0c;目的在于将月…

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第2关---8G 显存玩转书生大模型 Demo

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频&#xff1a;https://www.bilibili.com/video/BV18x4y147SU/ 课程文档&#xff1a; https://github.com/InternLM/Tutorial/blob/camp3/docs/L1/Demo/rea…

基于Zynq SDIO WiFi移植三(支持2.4/5G)

应用问题-WIFI作为AP-hostapd多次连接 设备作为WIFI热点时&#xff0c;连接出现了下述问题&#xff1a; 1 手机连接需要三次&#xff0c;三次都需要输入密码&#xff1b; 2 平板连接需要三次&#xff0c;三次都需要输入密码&#xff1b; 3 电脑连接需要一次&#xff0c;无感…

24个AI写作秘技,助你写出震撼人心的佳作!

最近&#xff0c;许多朋友开始尝试使用AI进行写作。然而&#xff0c;他们创作的文章常常显得语言过于正式&#xff0c;不仅缺乏沉浸感&#xff0c;发送后也很容易被系统检测出重复内容。我一直强调&#xff0c;在写作过程中&#xff0c;我们不应完全依赖AI。AI只是一种工具&…

[ComfyUI]Flux:超美3D微观山水禅意,经典中文元素AI重现,佛陀楼阁山水画卷

在数字艺术和创意领域&#xff0c;[ComfyUI]Flux以其独特的虚实结合技术&#xff0c;已经成为艺术家和设计师们手中的利器。今天&#xff0c;我们激动地宣布&#xff0c;[ComfyUI]Flux带来了一款超美的3D微观山水禅意作品&#xff0c;经典中文元素通过AI技术重现&#xff0c;包…

RabbitMQ(死信队列)

一、本文抒写背景 前面我也在延迟队列篇章提到过死信队列&#xff0c;也提到过一些应用场景&#xff01; 今天呢&#xff0c;这篇文章&#xff0c;主要就是实战一个业务场景的小Demo流程&#xff0c;哈哈&#xff0c;那就是延迟关闭订单。 二、开始啦&#xff01;letgo! 首…

No.0 笔记 | 从小白到入门:我的渗透测试笔记

嘿&#xff0c;小伙伴们&#xff01;好久不见啊&#xff0c;是不是都以为我失踪了&#xff1f;&#x1f602; 其实呢&#xff0c;最近一直在埋头苦学&#xff0c;感觉自己就像是在技术的海洋里游泳&#xff0c;每天都在吸收新知识。现在终于有时间冒个泡&#xff0c;跟大家分享…