【算法】双指针划分思想妙解移动零

news2025/1/26 15:51:56

在这里插入图片描述

Problem: 283. 移动零

文章目录

  • 思路
  • 算法图解分析
  • 复杂度
  • Code

思路

首先我们来讲一下本题的思路

  • 本题主要可以归到【数组划分/数组分块】这一类的题型。我们将一个数组中的所有元素划分为两段区间,左侧是非零元素,右侧是零元素

1.jpg

  • 那解决这一类的题我们首先想到的就是【双指针算法】,学习过C语言的同学应该就可以知道指针是比较繁琐和复杂,如果有兴趣学习的同学可以看看我的这篇文章 链接
  • 不过在这里呢我们不需要去使用int*这种指针,而是直接使用数组下标来充当指针即可

好,那我们就来看看这个双指针到底是怎样的,要如何去使用

  • 两个指针的作用
    • 【cur】: 从左往右扫描数组,遍历数组
    • 【dest】:已处理的区间内,非零元素的最后一个位置
  • 可以看到,cur是我们用来遍历数组的,从[cur, n - 1]就是还未处理的元素;那么从[0, cur]就是已经处理过的元素,但是呢本题的要求是我们要划分出【零元素】与【非零元素】,所以呢前面的区间我们可以再度划分为[0, dest][dest + 1, cur - 1]

3.jpg

小结一下:

[0, dest] [dest + 1, cur - 1] [cur, n - 1]

  • [0, dest] —— 非零元素
  • [dest + 1, cur - 1] —— 零元素
  • [cur, n - 1] —— 未处理元素

算法图解分析

接下去我们就通过画算法图解的形式来模拟一下解题的过程

  • 我们就以题目中所给出的第一个示例为例来进行讲解,因为在一开始我们还没处理过任何的非零元素,所以对于[0, cur - 1]这段区间是没有任何数据的,所以在一开始我们可以将【dest】这个指针置于-1的位置

4.jpg

  • 因为我们需要将非0元素移动到前面,所以呢如果遇到了0元素的话,cur++即可,将其留在这个位置上

5.jpg

  • 那当我们遇到非0元素时,就需要将其交换到前面去,那我们[0, dest]这个区间就是用来存放非0元素的,此时多了一个元素的话那dest就要加1,原本其是指向-1这个位置,那我们可以使用++dest来完成

6.jpg

  • 接下去,当数据交换过来后,我们可以去对照上面的这三个区间,可以发现最左侧是非0元素,中间是0元素,右侧呢则是待处理的元素。接下去我们又碰到了0元素,所以cur++

7.jpg

  • cur再后移之后呢,我们又碰到了非0元素,继续让dest上来然后交换二者位置上的元素

8.jpg

  • 那现在我们再来看这三个区间,左侧还是保持为【非0元素】,中间为【0元素】,右侧的话则是【待处理的元素】

9.jpg

  • 然后碰到非0元素后,继续让++dest,然后做交换

10.jpg

  • 最后的话我们来看看这个处理完后的整个区间元素:非0元素都在前面,而0元素则都在后面,[cur, n - 1]的这段区间也不存在了,说明已经没有待处理元素了

11.jpg

复杂度

接下去我们来分析一下本题的时空复杂度

  • 时间复杂度:

本算法的核心思路参考的是【快速排序】的区间划分,我们这里就是在不断遍历数组的过程中,以中间的0作为分割,然后左侧是非0元素,右侧是未处理的元素。在处理的过程中我们只是遍历了一次这个数组,所以复杂度为 O ( n ) O(n) O(n)

  • 空间复杂度:

在本题中我们并没有去开出额外的空间,所以复杂度为 O ( 1 ) O(1) O(1)

Code

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

在这里插入图片描述

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

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

相关文章

气象知识丨自动气象站的基本信息介绍

自动气象站的基本概述&#xff1a;自动气象站可以用于对大气温度、相对湿度、风向、风速、雨量、气压、太阳辐射、土壤温度、土壤湿度、能见度等众多气象要素进行全天候现场监测&#xff0c;具有气象信息服务功能&#xff0c;可以通过多种通讯方法与监控平台进行通讯&#xff0…

PyTorch学习笔记(十四)——网络模型的保存与读取

两种方式保存和加载模型 方式一 保存模型 不仅保存了网络模型的结构&#xff0c;也保存了网络模型的参数 import torch import torchvisionvgg16 torchvision.models.vgg16(weightsFalse) torch.save(vgg16,"vgg16_method1.pth") 加载模型 打印出的是网络模型的…

C++新经典05--文件操作

文件简介 文件在程序设计中是一个比较重要的概念&#xff0c;这里所说的文件&#xff0c;是指保存在硬盘、U盘等存储介质上的数据&#xff0c;这些存储介质&#xff08;简称磁盘&#xff09;上的数据就是以一个个文件的形式体现&#xff0c;每一个文件有一个对应的名字&#x…

描述性统计:集中趋势和分散

一、说明 在本文中&#xff0c;我们将深入研究描述性统计领域&#xff0c;探索其不同方面&#xff0c;包括统计类型、总体与样本、参数与统计、数据类型以及集中趋势和离散的度量。 让我幽默地向您介绍统计数据。 “统计数据就像比基尼。他们揭示的东西是暗示性的&#xff0c;但…

API开放!将语聚AI智能助手接入到您的自有系统中

概述 语聚AI基于集简云强大的应用软件“连接器”能力&#xff0c;提供了工具延展、知识延展、模型延展和嵌入集成等一系列功能&#xff0c;为用户带来了更加强大和智能的AI新体验。 我们深知&#xff0c;每家企业对于AI应用都有自己独特的需求和应用场景&#xff0c;只有通过开…

接口测试之Postman 安装与使用

Postman 安装 官网下载地址 www.postman.com/downloads Postman 使用 发送get请求 新建请求 填写请求方式&#xff1a;GET 填写请求 URL&#xff1a; ceshiren.com/ httpbin.ceshiren.com/get 填写请求参数&#xff1a; para_key para_value 发送 POST 请求 请求方式&a…

2023年的IC求职究竟有多难?

去年应移知教育要求&#xff0c;写了一篇关于秋招的看法《聊一聊今年的芯片就业市场》&#xff0c;当时提出来的点很简单&#xff1a; ● 处在赛道内的人要正视竞争的难度&#xff0c;提升自身的企业价值分&#xff1b; ● 想要进入赛道的人要放平心态&#xff0c;降低和保留…

C++ string类的模拟实现

模拟实现string类不是为了造一个更好的轮子&#xff0c;而是更加理解string类&#xff0c;从而来掌握string类的使用 string类的接口设计繁多&#xff0c;故而不会全部涵盖到&#xff0c;但是核心的会模拟实现 库中string类是封装在std的命名空间中的&#xff0c;所以在模拟…

ImageKit10 VCL Crack

ImageKit10 VCL Crack ImageKit10 VCL是一个允许您快速轻松地将图像处理功能添加到应用程序中的组件。使用ImageKit10 VCL&#xff0c;您可以编写从TWAIN扫描仪和数码相机检索图像的应用程序;加载和保存图像文件&#xff0c;并将图像从一种格式转换为另一种格式;编辑图像、在图…

MySQL的Json类型字段IN查询分组和优化方法

前言 MySQL从5.7的版本开始支持Json后&#xff0c;我时常在设计表格时习惯性地添加一个Json类型字段&#xff0c;用做列的冗余。毕竟Json的非结构性&#xff0c;存储数据更灵活&#xff0c;比如接口请求记录用于存储请求参数&#xff0c;因为每个接口入参不一致&#xff0c;也…

python的交互式库Qgrid

目录 Qgrid介绍Qgrid使用Qgrid使用过程中遇到的问题解决方案 Qgrid介绍 在Jupyter notebook中直接读取DataFrame数据&#xff0c;只显示为静态表格的形式&#xff0c;没有类似于excel的筛选等交互式功能。Qgrid作为 Jupyter notebook 组件&#xff0c;可以为我们的 DataFrame …

三本书与三场发布会,和鲸社区重新定义编程类书籍从阅读到实践新体验

当 AI 开发者社区配备 AI 基础设施开发平台工具时&#xff0c;它还能做什么&#xff1f; 答案是&#xff1a;过去半年&#xff0c;和鲸社区凭借在气象、医学、社科等垂直领域的长期积累以及多方伙伴的支持&#xff0c;联合举办了三场新书发布会——从 Python 到 R 语言 、从气…

程序员与ChatGPT的交织:探索人工智能和软件开发的新篇章

目录 前言创作者程序员会被替代吗程序员如何更好的使用chatgpt 前言 在技术持续进步的当今世界&#xff0c;程序员与人工智能&#xff08;AI&#xff09;之间的关系越来越紧密。特别是对于一些创新性的技术如OpenAI旗下的ChatGPT&#xff0c;这种联系就更为明显。程序员与Chat…

2023/8/16 华为云OCR识别驾驶证、行驶证

目录 一、 注册华为云账号开通识别驾驶证、行驶证服务 二、编写配置文件 2.1、配置秘钥 2.2、 编写配置工具类 三、接口测试 3.1、测试接口 3.2、结果 四、实际工作中遇到的问题 4.1、前端传值问题 4.2、后端获取数据问题 4.3、使用openfeign调用接口报错 4.3、前端显示问题…

python bytes基本用法

目录 1 第一个字符变大写&#xff0c;其余字符变小写 capitalize() 2 生成指定长度内容&#xff0c;然后把指定的bytes放到中间 center() 3 计数 count() 4 解码 decode() 5 是否以指定的内容结尾 endswith() 6 将制表符调整到指定大小 expandtabs() 7 寻找指…

ref拿到组件的实例对象或者原生html标签

在组件中&#xff0c;或者html标签中写ref属性&#xff0c;就是在注册引用 可以通过ref拿到组件的实例对象 也可以通过ref拿到原生的html标签

Linux系统安装及使用HHDBCS

1 安装 1.1 下载HHDBCS 使用浏览器进入官方社区&#xff08;恒辉产品社区&#xff09;&#xff0c;选择HHDBCS子社区&#xff0c;首页点击下载&#xff0c;进入下载页面&#xff1b; 选择官网下载/云盘下载皆可。 在弹出框中选择如图所示选项&#xff0c;点击下载&#xff…

带着设计思维画版图——第一次和第二次

版图设计目标&#xff1a; 面积小&#xff0c;性能好&#xff08;少恶化&#xff09;&#xff0c;成本低 设计规则规定了同层与不同层之间的最小距离&#xff0c;因此限制了最小面积 模拟版图设计流程 第一步&#xff1a;设计原理图输入 常用快捷键如下&#xff1a; 介…

YOLO算法封装进入ros系统,识别结果供其他节点订阅

一,前期工作空间搭建 新建工作空间,第一级名称可以换,第二级src最好别换,这是ros系统的固定格式 mkdir -p workspace_yolo/src切换到工作空间 workspace_yolo,进行编译构建项目 cd workspace_yolo/catkin_make输出如下所示: 添加环境变量 cd devel/ 获取到devel文件路径…

模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)

模型预测 一、导入关键包二、如何载入、分析和保存文件三、修改缺失值3.1 众数3.2 平均值3.3 中位数3.4 0填充 四、修改异常值4.1 删除4.2 替换 五、数据绘图分析5.1 饼状图5.1.1 绘制某一特征的数值情况&#xff08;二分类&#xff09; 5.2 柱状图5.2.1 单特征与目标特征之间的…