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

news2024/11/25 7:12:13

一.算法解析

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

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++;
            else
                dest += 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;
        else
            return false;
    }
};

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

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

相关文章

Tkinter打包成EXE安装文件

打包成 .exe可执行文件 1. 安装PyInstaller&#xff0c;命令如下&#xff1a; pip install pyinstaller2. 编写你的Tkinter应用程序&#xff1a; 创建一个Python文件&#xff0c;例如app.py&#xff0c;并写入你的Tkinter代码。 3. 在 app.py 文件所在的目录使用PyInstaller…

系统架构设计师⑤:系统性能

系统架构设计师⑤&#xff1a;系统性能 系统的性能指标主要分为2个方面&#xff1a;硬件和软件。 性能指标计算 关键词描述&#xff1a; ①平均每条指令的平均时钟周期个数(CPl&#xff0c;clockperinstruction) ②每(时钟)周期运行指令条数(IPC&#xff0c;instructionper…

OpenCV透视变换

#透视变换 import cv2 import numpy as np import matplotlib.pyplot as pltimg cv2.imread(coins.jpg,1)imgInfo img.shape height imgInfo[0] width imgInfo[1] #src 4->dst 4 (左上角 左下角 右上角 右下角) matSrc np.float32([[200,100],[200,400],[600,100],[wid…

数据驱动投资:AI在股票市场的应用

当ChatGPT首次亮相时&#xff0c;其卓越的语言处理能力立刻引起了许多行业的广泛关注&#xff0c;投资界也不例外。关于ChatGPT是否能应用于投资决策的问题&#xff0c;迅速成为热门讨论的焦点。 近期&#xff0c;加拿大多伦多大学和印度孟买理工学院的研究人员联合开展了一项…

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

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

Linux进程概念2

前言 1. Linux真实的调度算法 首先cpu中有一个叫做runqueue的东西&#xff0c;这个东西就是去弄进程的调度的&#xff0c;里面有很多东西&#xff0c;这里我们就写这些了 其中task_struct*这个数组指向的是140个元素&#xff0c;其中0~99就是系统默认的进程&#xff0c;后面的…

ARM assembly: lesson 11

在之前&#xff0c;我们提到&#xff0c;当函数的参数小于等于4个时&#xff0c;我们会把它存放于寄存器中&#xff0c;但是如果函数参数大于4个&#xff0c;我们就需要通过stack去进行参数的存储,这毫无疑问&#xff0c;将增加代码操作的复杂性&#xff0c;因为我们需要对于栈…

国外透明代理IP解析:匿名性的全貌

网络世界中&#xff0c;透明代理IP是一个广受关注的话题。究竟什么国外透明代理IP&#xff1f;以及它的匿名性如何&#xff1f;本文将深入解析透明代理IP的定义及其匿名性&#xff0c;为您呈现一个清晰的认识。 1. 概念 透明代理IP是指在进行网络请求时&#xff0c;客户端&am…

(数据结构与算法)哈希表

哈希表把他当成一个key-values表

鸿蒙harmonyos next flutter混合开发之开发plugin(获取操作系统版本号)

创建Plugin为my_plugin flutter create --org com.example --templateplugin --platformsandroid,ios,ohos my_plugin 创建Application为my_application flutter create --org com.example my_application flutter_application引用flutter_plugin&#xff0c;在pubspec.yam…

梯度下降学习

前言&#xff1a;初步学习梯度下降&#xff0c; 不断根据梯度修改我们的参数&#xff0c;经过多次轮次得到使得我们损失函数最小的时候参数&#xff0c;后续我们可以通过类似的道理&#xff0c;更新我们的参数 假设我们的损失函数是 y x 1 2 x 2 2 y x1^2 x2^2 yx12x22,我…

什么是 HTTP Get + Preflight 请求

当在 Chrome 开发者工具的 Network 面板中看到 GET Preflight 的 HTTP 请求方法时&#xff0c;意味着该请求涉及跨域资源共享 (CORS)&#xff0c;并且该请求被预检了。理解这种请求的背景&#xff0c;主要在于 CORS 的工作机制和现代浏览器对安全性的管理。 下面是在 Chrome …

常用排序算法(下)

目录 2.5 冒泡排序 2.6 快速排序 2.6 1 快速排序思路 详细步骤 2.6 2 快速排序递归实现 2.6 3快速排序非递归&#xff1a; 快排非递归的优势 非递归思路 1. 初始化栈 2. 将整个数组的起始和结束索引入栈 3. 循环处理栈中的子数组边界 4. 单趟排序 5. 处理分区后的子…

Linux驱动开发(速记版)--热插拔

第九十六章 热插拔简介 热插拔是指在设备运行时安全地插入或拔出硬件&#xff0c;无需关闭或重启系统。 它提供了方便性和灵活性&#xff0c;允许快速更换或添加硬件而无需中断任务。 以下是一些应用场景及支持热插拔所需的条件&#xff1a; 应用场景&#xff1a; USB设备&…

python中,try-except捕获异常的意义(通过ai智库学习)

python中&#xff0c;不但可以用try-except捕获异常&#xff0c; 还可以自定义异常提示字符串&#xff0c;更可以自定义捕获异常后的处置。 (笔记模板由python脚本于2024年10月03日 06:47:06创建&#xff0c;本篇笔记适合喜欢研究python的coder翻阅) 【学习的细节是欢悦的历程】…

交叠型双重差分法

交叠型双重差分法&#xff08;Staggered Difference-in-Differences, Staggered DiD&#xff09;是一种扩展的双重差分&#xff08;Difference-in-Differences, DiD&#xff09;方法&#xff0c;用于处理多个时间点的政策干预或处理组&#xff08;treatment group&#xff09;并…

每日读则推(四)

Whats this...? | An invitation letter n.邀请函 n.邀请(invite v.邀请) Can a tool grasp the meaning in a song? v. 握紧,理解 n.紧握,理解(力) Can it feel the melody, where emotions belong? …

C++ union的运用

// // Created by 徐昌真 on 2024/10/5. // #include <iostream> #include <cstring> using namespace std;//定义一个结构体(类) struct Info{char _name[20];int _role; //老师是0 同学是1union { //用union存放score和course 节省内存int score;char course[2…

全球十大独角兽(完整榜单),你猜中国占几席?

全球十大独角兽 10月3日&#xff0c;OpenAI 宣布已完成 66 亿美元融资&#xff0c;估值达 1570 亿美元&#xff0c;成为全球第三的独角兽。 给新来的读者重温一下"独角兽"的定义&#xff1a;估值超过10亿美元的未上市企业。 你可能会好奇&#xff0c;OpenAI 是第三&a…

Linux·进程概念(下)

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