每日一练:【优先算法】双指针之移动零(easy)

news2024/11/20 10:35:35

双指针概念介绍

常见的双指针有两种形式,一种是对撞指针,一种是左右指针。


对撞指针:一般用于顺序结构中,也称左右指针。
对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最右端开始,然后逐渐往中间逼近。
对撞指针的终止条件一般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循
环),也就是:
◦ left == right (两个指针指向同一个位置)
◦ left > right (两个指针错开)


快慢指针:又称为龟兔赛跑算法

其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上移动
这种方法对于处理环形链表或数组非常有用。
其实不单单是环形链表或者是数组,如果我们要研究的问题出现循环往复的情况时,均可考虑使用快慢指针的思想。
快慢指针的实现方式有很多种,最常用的一种就是:
在一次循环中,每次让慢的指针向后移动一位,而快的指针往后移动两位,实现一快一慢。

注:上述双指针是一种抽象的概念,对于像数组的结构,我们是通过记录对应的位置来达成像指针的效果,并不一定是创建指针

1. 题目链接:283. 移动零

题目分析:

本题我们需要将非零元素移动到数组前面,并且保持相对位置不变,非零元素的之后都是0,0不要求相对顺序不变,,根据题目条件限制,不能复制数组,意味着算法的空间复杂度为0。

要将非零数放到前面,0放到后面,原地的情况下,我们只能采用交换的方法。因此这里我们使用双指针的方法。

由于需要保持非0数的相对顺序,这就意味着算法需要具有一定的稳定性,如果双指针是对向移动,那么数字的相对顺序就会改变。因此指针一定是同向移动的。

算法原理

观察数组,发现数组整体是分成两部分的,非零元素放在一块,零元素放在一块,再基于题目分析中的条件,这题我们采用数组分块的思想(这也是快排的一种实现思想)。

我们创建dest与src指针(效果上的指针,实际上通过[]+下标实现)我们将dest初始化为-1,src初始化为0,通过dest与src的交错,我们就将数组划分成三个部分。

dest左边是已处理的数据,也就是我们非零数将要存放的位置,dest与src之间的区间将要将要存放0,src右边的区间是还没有处理的数据。

每一次遇到0,src++,dest不动,每一次dest之间区间长度的变化都是因为遇到0,这样src与dest之间相差的就都是0了,遇到非0数,因为dest指向的位置及其左边的区间是已经处理完的数即非0数,我们不能直接交换dest与src指向的值,我们先将++dest,dest指向0,src指向非0值,我们再将dest与src指向值交换,再将src++,这样非0值始终在dest指向的左区间,0始终在dest与src之间,src指向及右区间是未处理数据。当src出数组,就说明所以数据处理完,循环结束。

算法代码

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

};

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

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

相关文章

ASP.NET Core Webapi 返回数据的三种方式

ASP.NET Core为Web API控制器方法返回类型提供了如下几个选择&#xff1a; Specific type IActionResult ActionResult<T> 1. 返回指定类型&#xff08;Specific type&#xff09; 最简单的API会返回原生的或者复杂的数据类型&#xff08;比如&#xff0c;string 或者…

【JAVA】使用mybatis plus查询数据库中的geometry字段为null

目录 问题描述&#xff1a; 原码&#xff1a; 实体类&#xff1a; 接口&#xff1a; 解决方法&#xff1a; 1、创建Handle 2、配置handle让mybatis-plus能够识别 相关代码&#xff1a; 问题描述&#xff1a; 在 MyBatis Plus 中&#xff0c;查询的 geometry 字段在数据库…

51c自动驾驶~合集28

我自己的原文哦~ https://blog.51cto.com/whaosoft/12030824 #自动驾驶建图的统一矢量先验地图编码 高德地图&西交 | 先验驾驶 论文链接&#xff1a;https://arxiv.org/pdf/2409.05352 写在前面&笔者的个人理解 最近出现了很多先验地图的论文&#xff0c;高德地图…

【全面解读】Apache SeaTunnel常见问题全攻略

使用SeaTunnel需要安装Spark或者Flink这样的引擎么&#xff1f; 不需要&#xff0c;SeaTunnel 支持 Zeta、Spark 和 Flink 作为同步引擎的选择&#xff0c;您可以选择之一就行&#xff0c;社区尤其推荐使用 Zeta 这种专为同步场景打造的新一代超高性能同步引擎。Zeta 被社区用…

Spring Boot3.x自动配置不生效的排查与解决:IDEA 文件夹命名导致的问题

在使用Spring Boot搭建多模块项目时&#xff0c;需要使用到自动配置功能&#xff0c;把一些通用功能封装成模块后通过 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件注册配置类。然而&#xff0c;最近遇到一个奇怪的问题&#xff1a…

JavaSE(十四)——文件操作和IO

文章目录 文件操作和IO文件相关概念Java操作文件文件系统操作文件内容操作字节流FileOutputStreamFileInputStream代码演示 字符流FileWriterFileReader代码演示 缓冲流转换流 案例练习 文件操作和IO 文件相关概念 文件 通常指的是包含用户数据的文件&#xff0c;如文本文件、…

Qt桌面应用开发 第五天(常用控件)

目录 1.QPushButton和ToolButton 1.1QPushButton 1.2ToolButton 2.RadioButton和CheckBox 2.1RadioButton单选按钮 2.2CheckBox多选按钮 3.ListWidget 4.TreeWidget控件 5.TableWidget控件 6.Containers控件 6.1QScrollArea 6.2QToolBox 6.3QTabWidget 6.4QStacke…

Vue.js 插槽 Slots 实际应用 最近重构项目的时候遇到的...

前端开发中 插槽 Slots 是一个重要的概念 我们可以查看一下vue.js的官方文档 https://cn.vuejs.org/guide/components/slots 类似于连接通道一样 可以把核心代码逻辑搬到另外的地方 做一个引用 而原先的地方可能并不能这样书写 对于这个概念我在vue的官方文档里面找到了…

ubuntu pytorch容器内安装gpu版本的ffmpeg

一、基础镜像和生成容器 pytorch/pytorch &#xff1a;1.13.1-cuda11.6-cudnn8-devel 生成容器&#xff0c;一定要加NVIDIA_DRIVER_CAPABILITIEScompute,utility,video,graphics&#xff0c;否则侯建无法推流&#xff0c;报错缺少编码之类的。 docker run -it --gpus all -e …

VSCode+ESP-IDF开发ESP32-S3-DevKitC-1(2)第一个工程 LED心跳灯

VSCodeESP-IDF开发ESP32-S3-DevKitC-1&#xff08;2&#xff09;第一个工程 LED心跳灯 前言1.新建工程2.编写控制LED代码3.LED控制独立成.c和.h文件 前言 实际开发中很多时候我们需要有一个类似心跳灯或运行指示灯的灯以不同的状态闪烁以表示程序的运行状态&#xff0c;所以第…

在ubunto18.04安装node 14.16.0

这里演示安装node 14.16.0&#xff0c;其他版本也一样的安装步骤&#xff0c;需要注意1 1.检查本机服务器类型&#xff0c;有的是x64&#xff0c;有的是ARM&#xff0c;先查清楚是什么类型再进行下载&#xff0c;否则会存在编译出错的问题 bash: /opt/node-v14.16.0-linux-x6…

基于YOLOv8深度学习的智慧农业猪行为检测系统研究与实现(PyQt5界面+数据集+训练代码)

随着智慧农业的快速发展&#xff0c;畜牧业的智能化管理已逐渐成为提高生产效率、提升动物福利、降低运营成本的关键手段之一。在此背景下&#xff0c;畜牧场对动物行为的自动化监测需求日益增长&#xff0c;尤其是在大型养猪场&#xff0c;猪群的日常行为检测对于疾病预防、饲…

独立资源池与共享资源池在云计算中各自的优势

在云计算领域&#xff0c;独立资源池和共享资源池是两种关键的资源管理策略&#xff0c;它们各自具有独特的优势&#xff0c;以适应不同的业务需求和场景。 独立资源池的优势 资源独占性&#xff1a;独立资源池为特定应用或用户提供专属的资源&#xff0c;这意味着资源不会被其…

异或和之和

//暴力做法 枚举每个子区间 O(n^3) //优化1 利用前缀异或和快速求出区间异或和 O(n^2) //优化2 处理位运算的常用方法&#xff1a;拆位法 常用的思想&#xff1a;贡献法思想 下面详见优化2&#xff1a; 1.拆位贡献法 2.实战真题1 题目链接&#xff1a;1.异或和之和 - 蓝桥…

【金融风控项目-07】:业务规则挖掘案例

文章目录 1.规则挖掘简介2 规则挖掘案例2.1 案例背景2.2 规则挖掘流程2.3 特征衍生2.4 训练决策树模型2.5 利用结果划分分组 1.规则挖掘简介 两种常见的风险规避手段&#xff1a; AI模型规则 如何使用规则进行风控 **使用一系列逻辑判断(以往从职人员的经验)**对客户群体进行区…

第8章硬件维护-8.2 可维护性和可靠性验收

8.2 可维护性和可靠性验收 可维护性和可靠性验收非常重要&#xff0c;硬件维护工程师在后端发现问题后&#xff0c;总结成可维护性和可靠性需求&#xff0c;在产品立项的时候与新特性一起进行需求分析&#xff0c;然后经过设计、开发和测试环节&#xff0c;在产品中落地。这些需…

在k8s上部署minio

一、 环境 已部署k8s&#xff0c;支持helm部署 二、添加Minio Helm Chart仓库 helm repo add bitnami https://charts.bitnami.com/bitnami -n your_namespace helm repo update -n your_namespace部署带tls的minio helm install minio-s3 bitnami/minio -n your_namespace…

gtest 框架

基本了解 google提供的一个C测试框架&#xff0c;主要就是简化测试单元的书写&#xff0c;具有高效、灵活可拓展的特点 主要特点 简单易用&#xff1a;gtest 提供了清晰且易于使用的 API&#xff0c;便于开发者快速编写单元测试。丰富的断言支持&#xff1a;gtest 提供了多种断…

机器学习—误差分析

帮助运行诊断的最重要的方法是选择下一步要尝试的内容&#xff0c;提高你的学习算法性能&#xff0c;偏差和方差可能是最重要的想法&#xff0c;然后是错误分析。 假设Mcv500&#xff0c;即有500个交叉验证示例&#xff0c;你的算法错误的分类了100个&#xff0c;错误分析过程…

微知-如何查看BlueField DPU上的内存信息,包括内存主频和位宽?(dmidecode -t memory)

背景 在定位DPU上网卡性能的时候&#xff0c;可能涉及到查看内存的主频、位宽、电压等信息&#xff0c;如何快速查看&#xff1f; 命令 dmidecode -t memory实操 可以看到主频是 3200MT/s&#xff0c;另外还能看到位宽&#xff0c;大小&#xff0c;电压等信息。