【双指针】:Leetcode283.移动零

news2024/11/18 2:29:50

朋友们、伙计们,我们又见面了,本专栏是关于各种算法的解析,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

目录

1. 双指针思想

2. 移动零

2.1 题目解析

2.2 算法思路

2.3 代码实现


1. 双指针思想

常见的双指针有两种形式:一种是对撞指针、一种是快慢指针

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

  • 对撞指针从两端向中间移动,⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。
  • 对撞指针的终⽌条件⼀般是两个指针相撞或者错开(也可能在循环内部找到结果直接跳出循环),也就是:

                left==right(两个指针相撞)

                left>rigth(两个指针错开)

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

  • 这种⽅法对于处理环形链表或数组以及循环往复的问题⾮常有⽤。
  • 快慢指针的实现⽅式有很多种,最常⽤的⼀种就是:
  • 在⼀次循环中,每次让慢的指针向后移动⼀位,⽽快的指针往后移动两位,实现⼀快⼀慢。

2. 移动零

Leetcode283.移动零:https://leetcode.cn/problems/move-zeroes/

题目描述:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]输出: [0]

2.1 题目解析

根据题目描述,通过区间的划分对数组进行操作,可以简单的理解为将整个数组划分为两块,「数组分两块」是⾮常常⻅的⼀种题型,主要就是根据⼀种划分⽅式,将数组的内容分成左右两部分。这种类型的题,⼀般就是使⽤「双指针」来解决。

2.2 算法思路

解决本题使用的是双指针算法:

在这里为了方便,可以直接使用数组的下标来进行指针的模拟,要想对数组进行分块,首先设置一个指针(cur)对数组进行遍历,要将非0放到左边还需要一个指针(dest)来对数组进行区域划分,那么这两个指针的作用分别是:

cur:从左向右扫描,遍历整个数组。

dest:已处理区间内,非0元素的最后一个位置。

在遍历的整个过程中这两个指针会将数组分为三个区间:

如何实现呢?

首先让cur和dest都指向数组的起始位置(或者让dest指向-1的位置),然后让cur指针向后遍历,这时cur指针会遇到两种情况:

1. 遇到0时,直接++cur,继续向后面走。

2. 遇到非0时,需要交换dest位置与cur位置的元素,然后再将dest和cur加1。

结束的条件cur遍历完整个数组。

2.3 代码实现

使用最简单的循环语句即可完成遍历和判断:

class Solution 
{
public:
    void moveZeroes(vector<int>& nums) 
    {
        int cur = 0, dest = 0;
        for(;cur < nums.size(); cur++)
        {
            if(nums[cur])  //非0再交换
                swap(nums[dest++], nums[cur]);  //后置++,使用完了再++进行迭代
            //为0就继续向后面迭代
        }
    }
};

算法小总结:

数组分块,区间划分是在快速排序算法 中也有提到的,快速排序算法的关键就是进行区间的划分。

朋友们、伙计们,美好的时光总是短暂的,我们本期算法的分享就到此结束,欲知后事如何,请听下回分解~,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!  

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

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

相关文章

【python】—— 内置类型、运算符、表达式、关键字

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

【管理运筹学】运筹学“背诵手册”(二) | 对偶理论与灵敏度分析

二、对偶理论与灵敏度分析 用矩阵形式表示原问题和对偶问题&#xff1a; max ⁡ z C X s . t . { A X ≤ b X ≥ 0 \max z\pmb{CX}\\ s.t.\begin{cases} \pmb{AX\leq b} \\ \pmb{X}\geq\pmb{0} \end{cases} maxzCXs.t.{AX≤bX≥0​ 其中 C ( c 1 , c 2 , ⋯ , c n ) , X (…

【广州华锐互动】消防科普VR实训展馆增强群众学习兴趣和沉浸感

在现代社会&#xff0c;科技的发展已经深入到我们生活的各个角落&#xff0c;其中包括教育和信息传播领域。3D技术的引入为科普教育提供了全新的可能性。特别是在消防安全教育中&#xff0c;消防科普VR实训展馆的应用&#xff0c;不仅可以提高公众的消防安全意识&#xff0c;还…

HCIA-经典综合实验(二)

经典综合实验&#xff08;二&#xff09; 实验拓扑配置步骤配置Eth-Trunk聚合链路第一步 配置二层VLAN第二步 配置MSTP生成树第三步 配置相关IP地址第四步 配置DHCP及DHCP中继第五步 配置三层的网关冗余协议 VRRP及OSPF第六步 配置静态路由,NAT地址转换及其他配置完善 配置验证…

【Regulatory Genomics】Part2 BPNet、DeepLIFT

文章目录 Deep learning at base-resolution reveals cis-regulatory motif syntaxproblemBPNet: predicting base-resolution profiles from DNA sequenceInterpreting the predictions of BPNet1 DeepLIFT2 TF-MoDISCO3 motif syntax derived TF cooperativity Experimental …

Visual Studio Code安装和设置中文

文章目录 Visual Studio Code安装Visual Studio Code设置中文 步骤如下: Visual Studio Code安装 1.下载安装包 VS Code的官网 下载链接中的“az764295.vo.msecnd.net” 替换为国内镜像地址“vscode.cdn.azure.cn”&#xff0c;下载速度直接飙升至几十 Mb/s。(在官网下载速度…

Elasticsearch 之聚合分析

本文主要介绍 Elasticsearch 的聚合功能&#xff0c;介绍什么是 Bucket 和 Metric 聚合&#xff0c;以及如何实现嵌套的聚合。 首先来看下聚合&#xff08;Aggregation&#xff09;&#xff1a; 1 什么是 Aggregation&#xff1f; 首先举一个生活中的例子&#xff0c;这个是京…

【Python】一文带你掌握数据容器之集合,字典

目录&#xff1a; 一、集合 思考&#xff1a;我们目前接触到了列表、元组、字符串三个数据容器了。基本满足大多数的使用场景为何又需要学习新的集合类型呢? 通过特性来分析: &#xff08;1&#xff09;列表可修改、支持重复元素且有序 &#xff08;2&#xff09;元组、字符…

解决k8s通过traefik暴露域名失败并报错:Connection Refused的问题

我敢说本篇文章是网上为数不多的解决traefik暴露域名失败问题的正确文章。 我看了网上太多讲述traefik夸夸其谈的文章了&#xff0c;包含一大堆复制粘贴的水文和还有什么所谓“阿里技术专家”的文章&#xff0c;讲的全都是错的&#xff01;基本没有一个能说到点子上去&#xf…

用LLM生成反驳:首先洞察审稿人的心理,再巧妙回应!

深度学习自然语言处理 原创作者&#xff1a;Winnie 在科研领域&#xff0c;同行评审(review-rebuttal)是保证学术质量的关键环节。这一过程中的辩论和反驳非常具有挑战性。传统的同行评审生成任务通常集中在表面层面的推理。 研究人员发现&#xff0c;考虑论点背后的态度根源和…

aliyun Rest ful api V3版本身份验证构造

aliyun Rest ful api V3版本身份验证构造 参考官网&#xff1a;https://help.aliyun.com/zh/sdk/product-overview/v3-request-structure-and-signature?spma2c4g.11186623.0.0.787951e7lHcjZb 构造代码 &#xff1a;使用GET请求进行构造&#xff0c;算法使用sha256 使用postm…

多维时序 | MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多变量时间序列预测

多维时序 | MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多变量时间序列预测预测效果基本介绍模型描述程序设计参考…

Python安装第三方库出错完美解决方法

错误 Could not find a version that satisfies the requirement PIL (from versions: none) ERROR: No matching distribution found for PILTry to run this command from the system terminal. Make sure that you use the correct version of pip installed for your Pyth…

Linux:给openlab搭建web网站

httpd服务器建立综合练习 建立网站需求&#xff1a; 1.基于域名 www.openlab.com 可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c; &#xff08;1&#xff09;、基于 www.openlab.com/stud…

使用Pandas进行数据读写的简易教程

Pandas是一个功能强大且广泛使用的Python库。它提供了一种简单而灵活的方式来读取和写入各种数据格式&#xff0c;包括CSV、Excel、SQL数据库等。本文将介绍如何使用Pandas进行数据的读取和写入操作&#xff0c;帮助你快速上手并高效地处理数据。 一、安装和导入pandas 首先&…

Linux软硬链接

文章目录 &#x1f40b;1. 建立软硬链接现象&#x1f420;2. 软硬链接&#x1fab8;2.1 软链接&#x1fab8;2.2 硬链接 &#x1f426;3. 应用场景&#x1fab9;3.1 软链接应用场景&#x1fab9;3.2 硬链接应用场景 &#x1f40b;1. 建立软硬链接现象 我们这里给file.txt建立软…

CH12_处理继承关系

函数上移&#xff08;Pull Up Method&#xff09; 反向重构&#xff1a;函数下移&#xff08;Push Down Method&#xff09; class Employee {/*...*/} class Salesman extends Employee {get name() {/*...*/} } class Engineer extends Employee {get name() {/*...*/} }cla…

AI数字员工创新工作模式丨市女协走进实在智能,沉浸体验RPA Agent智能魅力

11月10日&#xff0c;杭州市女企业家协会组织走进副会长张军燕企业——杭州实在智能科技有限公司&#xff0c;开展“领跑AI时代&#xff0c;做先进企业”人工智能沙龙活动。 本次沙龙是一场真正关注最前沿AI大模型与RPA自动化技术、寻找企业确定性增长的科技盛宴&#xff0c;也…

《深入浅出.NET框架设计与实现》阅读笔记(四)

静态文件系统 通过ASP.NET Core 提供的静态文件模块和静态文件中间件&#xff0c;可以轻松的让应用程序拥有访问静态文件的功能&#xff0c;同时可以基于IFileProvider对象来自定义文件系统&#xff0c;如基于Redis做扩展文件系统 启动静态文件服务 在Program.cs 类中&#x…