双指针算法(一)

news/2024/10/21 9:58:08/
一、移动零

题目链接

题目详情:

1.算法分析

这道题采用的算法原理是双指针算法:利用数组下标当做指针。

利用双指针算法的目的就是进行数组划分、数组分块。

我们先定义一个下标cur和一个下标dest。

两个指针的作用:

cur:从左至右的进行遍历数组。

dest:指向已经处理的区间的最后一个非零元素的位置。

这样区间就被分为三块:

已经处理过的区间的非零元素:[0, dest]

已经处理过的区间的为0的元素:[dest + 1, cur - 1]

未处理区间:[cur, size - 1], size是数组长度

2.具体做法

在cur从左到右的遍历过程中:
1.如果cur所指向的元素为0, 就cur++

2.如果cur所指元素不为0, 就swap(dest + 1, cur) , dest++, cur++

3.代码实现

这道题目的代码实现也挺简单,首先让cur指向下标为0的位置, dest指向下标-1的位置,也就是数组第一个元素的前一个位置。

class Solution {
public:void moveZeroes(vector<int>& nums) {//先定义两个下下标,一个指向数组第一个元素的前一个位置//另一个指向数组的第一个元素的位置int dest = -1;int cur = 0;//通过循环遍历数组while(cur < nums.size()){//如果cur所指向的位置为0的话就++curif(nums[cur] == 0){++cur;}//不为零的话就停下,然后交换dest + 1所指向位置的元素以及cur所指向的元素//交换之后++dest,++curelse{swap(nums[dest + 1], nums[cur]);++dest;++cur;}}}
};
二、复写零

题目链接

题目详情:

1.算法分析

这道题和上道题的类型差不多,也是可以使用双指针算法解决的, 但是这个题的难度要比上一个题大一些。

首先,我们看题目的要求,将数组中的每个零都复写一遍,将其余元素右移,复写后被挤出数组范围的元素就舍弃,对数组进行就地修改,也就是不能使用辅助数组。

我们先定义两个下标一个是cur指向数组第一个位置,也就是0下标,还有就是dest指向数组第一个元素的前一个位置,就是-1下标的位置。

2. 具体做法

1.先找到最后一个复写的数

使用cur进行遍历,如果cur所指位置不为0, dest++,否则dest += 2

2.处理边界情况

当初循环后dest == size时, 说明最后一个需要复写的数是0, arr[size - 1] = 0, cur–, dest -= 2

3.从后往前对数组进行复写

1.cur所指位置不为0, 复写一次, arr[dest] = arr[cur] , dest–, cur–

2.cur所指位置为0, 复写两次, arr[dest] = arr[cur], arr[dest - 1] = arr[cur], dest -= 2, cur–

3.代码实现
class Solution {
public:void duplicateZeros(vector<int>& arr) {int dest = -1, cur = 0;int size = arr.size();//先找到最后一个需要复写的数while(dest < size){if(arr[cur] != 0){dest++;}else{dest += 2;}if(dest >= size - 1)break;cur++;}//处理边界情况if(dest == size){arr[size - 1] = 0;cur--;dest -= 2;}//从后往前进行复写while(cur >= 0){if(arr[cur] != 0){arr[dest] = arr[cur];dest--;}else{arr[dest] = arr[cur];arr[dest - 1] = arr[cur];dest -= 2;}cur--;}}
};
三、快乐数

题目链接

题目详情:

1.算法分析

我们先来看题目要求,题目取得很好快乐数,但是对于做题的人快乐不快乐就不一定了。

题目里说到,快乐数就是一直计算这个数的各位的平方和,如果这个数字到最后能够变为1,那么就快乐,否则不快乐。

这道题是比较简单的,也是可以使用我们的双指针算法来进行解决的。

2.具体做法

定义一个快慢指针,实际上就是一个int类型的数字, 快指针一次走两步, 慢指针一次走一步, 我们在尝试计算平方和的时候可以发现,如果它的平方和走到为1 时 ,后面在怎么求也都是1, 如果不是一出了循环那么这个数永远则始终变不到1。

我们先实现一个计算平方和的函数, 然后,慢指针走一步就是调用一次这个函数,快指针一回调用两次这个函数。

3.代码实现
class Solution {
public:void duplicateZeros(vector<int>& arr) {int dest = -1, cur = 0;int size = arr.size();//先找到最后一个需要复写的数while(dest < size){if(arr[cur] != 0){dest++;}else{dest += 2;}if(dest >= size - 1)break;cur++;}//处理边界情况if(dest == size){arr[size - 1] = 0;cur--;dest -= 2;}//从后往前进行复写while(cur >= 0){if(arr[cur] != 0){arr[dest] = arr[cur];dest--;}else{arr[dest] = arr[cur];arr[dest - 1] = arr[cur];dest -= 2;}cur--;}}
};

这篇文章到这里就结束了,先通过这几道例题,介绍一下双指针这个比较灵活并且规律不太好寻找的算法,后面的一篇文章会继续对双指针算法进行探讨。


http://www.ppmy.cn/news/1506101.html

相关文章

Midjourney V6.1更新 | 细节狂魔,绝美人像(附提示词)

前言 Midjourney V6.1版本&#xff0c;堪称细节狂魔&#xff0c;在人像上简直登峰造极&#xff01; 自V6.1版本更新以来我一次次被Midjourney生成的人像震惊到&#xff01;用Midjourney官网分享的提示词微调&#xff0c;生成图像&#xff0c;每一张都绝美&#xff0c;晚上玩到…

LeetCode题练习与总结:查找重复的电子邮箱--182

一、题目描述 SQL Schema > Pandas Schema 表: Person ---------------------- | Column Name | Type | ---------------------- | id | int | | email | varchar | ---------------------- id 是该表的主键&#xff08;具有唯一值的列&#xff0…

【区块链+医疗健康】基于区块链的中药饮片流转质量服务与监管平台 | FISCO BCOS应用案例

有数据显示&#xff0c;医疗机构委托第三方代煎代配业务已经占到医院代煎业务总量的 92.3%。委托代煎业务虽然方便了 医疗机构和患者&#xff0c;但业务过程牵涉处方外流&#xff0c;业务范围从“医院 - 患者”扩展到“医院 - 中药代煎中心 - 物流 - 患者”&#xff0c; 涉及到…

从混沌到秩序:一本书教你掌握互联网内容审核与信息安全的密钥

随着互联网技术的迅猛发展&#xff0c;视频、图片、文字等多媒体内容以前所未有的速度在全球范围内传播与分享&#xff0c;极大地丰富了人们的信息获取渠道和娱乐生活方式。然而&#xff0c;这一繁荣景象背后&#xff0c;也隐藏着内容安全、版权侵犯、虚假信息传播、不良内容泛…

Docker深入讲解

Docker深入讲解 目录 概述Docker基本概念 2.1 什么是Docker2.2 Docker的核心组件2.3 Docker与传统虚拟化技术的比较 Docker安装与配置 3.1 安装Docker3.2 配置Docker3.3 验证Docker安装 Docker镜像 4.1 什么是Docker镜像4.2 获取和管理镜像4.3 Dockerfile的使用4.4 构建镜像 …

react学习笔记:7

预览&#xff1a;&#xff08;fetch发送请求、SPA、连续解构赋值、消息订阅、react router路由第三方库&#xff09; 1、连续解构赋值 总结&#xff1a; 1、连续解构赋值的写法&#xff1a;对象包对象&#xff0c;第二个解构的value一定也是在{}内部的写法 2、消息订阅发布 …

【算法速刷(5/100)】LeetCode —— 20.有效的括号

题目要求比较明晰简洁&#xff0c;编码难度并不算高 下面贴出代码和思路 bool isValid(string s) {stack<char> stk;for(const char& c : s){if(stk.empty()){stk.push(c);continue;}if(c ( || c [ || c {){stk.push(c);continue;}else{char top stk.top();boo…

Python学习(1):使用Python的Dask库实现并行计算

目录 一、Dask介绍 二、使用说明 安装 三、测试 1、单个文件中实现功能 2、运行多个可执行文件 最近在写并行计算相关部分&#xff0c;用到了python的Dask库。 Dask官网&#xff1a;Dask | Scale the Python tools you love 一、Dask介绍 Dask是一个灵活的并行和分布式…