【代码随想录刷题记录】LeetCode283移动零

题目地址

1. 思路

1.1 基本思路及假设

拿到这个题,首先想到,这是类似删除元素的方法,因为删除元素也是移动元素,但是移动的方向和删除元素的方法刚好相反,我们都知道,如果在数组中删除某个元素,其方法是向前逐渐覆盖这个要删除的元素的位置,也就是从右向左移动覆盖,但是这次我们要把需要移动的0依次向右移动,而我们之前写过的【代码随想录刷题记录】LeetCode27移除元素是类似的思路,我们只需要魔改LeetCode27移除元素的代码,它的代码如下:

class Solution {
public:
    // 引用传递,直接改nums,是改其本身,不是拷贝
    int removeElement(vector<int>& nums, int val) {
        int slow = 0; //慢指针,用来记录删除该元素后,每个元素对应的新下标slow
        for(int fast = 0; fast < nums.size(); fast++)
        {
            if(val != nums[fast])
            {
                // 下一次循环必须先执行赋值操作再进行slow的自增
                nums[slow] = nums[fast];
                slow++;
            }       
        }
        return slow;
    }
};

我们需要修改for循环的if条件来达到遇到0就移动的目的,也就是将if(val != nums[fast])转换为if(nums[fast] != 0),然后我们思考一下,if条件里面的逻辑是逐渐从右向左移动覆盖,我们要将其改成从左向右移动,具体if条件里该写什么,我们写一个简单的例子试一试(这里假设我们的if条件写的东西还不知道是什么):
假设有数组nums[2,0,2]

fast=0

由于 nums [ fast ] = nums [ 0 ] = 2 ≠ 0 \text{nums}[\text{fast}]=\text{nums}[0]=2\ne0 nums[fast]=nums[0]=2=0则,进入if条件,因为slow和fast指向的都是同一个元素,我们还是不知道到底该写什么样的逻辑才能从左向右不覆盖式地移动元素,这里似乎用nums[slow]=nums[fast]也可以,并且在不等的条件下,slow是要自增的,我们假设做了上述操作,继续下一次循环:
fast=1

由于 nums [ fast ] = nums [ 1 ] = 0 = 0 \text{nums}[\text{fast}]=\text{nums}[1]=0=0 nums[fast]=nums[1]=0=0则,此时,找到了0,为了能移动,slow不再自增,fast继续自增,没有进入if条件,继续下一次循环:
fast=2

由于 nums [ fast ] = nums [ 2 ] = 2 ≠ 0 \text{nums}[\text{fast}]=\text{nums}[2]=2\ne0 nums[fast]=nums[2]=2=0则,进入if条件,现在我想让0移动到最后,就需要让slow和fast指向的元素互换位置,我们大胆假设这是对的,并写出了如下代码:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        //模仿O(n)的删除数组元素的方法删除0
        //if条件由nums[fast]!=val改成nums[fast]!=0
        //但是这次不是仅仅nums[slow]=nums[fast],而是将它们两个交换
        int slow = 0;
        int temp = 0;//临时变量存储交换值
        for(int fast = 0; fast < nums.size(); fast++)
        {
            if(nums[fast]!=0)
            {
            	//交换元素位置
                temp = nums[slow];
                nums[slow] = nums[fast];
                nums[fast] = temp;
                slow++;
            }
        }
    }
};

1.2 算法的基本情况

由于我们是从左向右移动元素,那么就分为3个情况

  • 0在末尾(此时不需要移动)
  • 0不在末尾
  • 数组中没有0

1.3 验证假设

1.3.1 0在末尾(此时不需要移动)

假设数组nums[2,3,0]:
fast=0

由于 nums [ fast ] = nums [ 0 ] = 2 ≠ 0 \text{nums}[\text{fast}]=\text{nums}[0]=2\ne0 nums[fast]=nums[0]=2=0则交换slow和fast指向的元素(指向同一个元素,相当于没换),slow自增

fast=1

由于 nums [ fast ] = nums [ 1 ] = 3 ≠ 0 \text{nums}[\text{fast}]=\text{nums}[1]=3\ne0 nums[fast]=nums[1]=3=0则交换slow和fast指向的元素(指向同一个元素,相当于没换),slow自增

fast=2

由于 nums [ fast ] = nums [ 3 ] = 0 = 0 \text{nums}[\text{fast}]=\text{nums}[3]=0=0 nums[fast]=nums[3]=0=0则什么都不做,退出循环
最后结果还是[2,3.0]
结果正确

1.3.2 0不在末尾

假设数组nums[0, 2, 0, 3]:
fast=0

由于 nums [ fast ] = nums [ 0 ] = 0 = 0 \text{nums}[\text{fast}]=\text{nums}[0]=0=0 nums[fast]=nums[0]=0=0则什么都不做,进入下一次循环
fast=1

由于 nums [ fast ] = nums [ 1 ] = 2 ≠ 0 \text{nums}[\text{fast}]=\text{nums}[1]=2\ne0 nums[fast]=nums[1]=2=0则交换slow和fast指向的元素,slow自增

fast=2

由于 nums [ fast ] = nums [ 2 ] = 0 = 0 \text{nums}[\text{fast}]=\text{nums}[2]=0=0 nums[fast]=nums[2]=0=0则什么都不做,进入下一次循环
fast=3

由于 nums [ fast ] = nums [ 3 ] = 3 ≠ 0 \text{nums}[\text{fast}]=\text{nums}[3]=3\ne0 nums[fast]=nums[3]=3=0则交换slow和fast指向的元素,slow自增

循环结束,数组是[2, 3, 0, 0],结果正确

1.3.3 数组中没有0

假设数组nums[1, 2, 3]
fast=0

由于 nums [ fast ] = nums [ 0 ] = 1 ≠ 0 \text{nums}[\text{fast}]=\text{nums}[0]=1\ne0 nums[fast]=nums[0]=1=0则交换slow和fast指向的元素(指向同一个元素,相当于没换),slow自增


fast=1

由于 nums [ fast ] = nums [ 1 ] = 2 ≠ 0 \text{nums}[\text{fast}]=\text{nums}[1]=2\ne0 nums[fast]=nums[1]=2=0则交换slow和fast指向的元素(指向同一个元素,相当于没换),slow自增

fast=2

由于 nums [ fast ] = nums [ 2 ] = 3 ≠ 0 \text{nums}[\text{fast}]=\text{nums}[2]=3\ne0 nums[fast]=nums[2]=3=0则交换slow和fast指向的元素(指向同一个元素,相当于没换),slow自增


循环结束,数组是[1,2,3],结果正确

1.4 总结

这个题只要想明白将原来的 O ( n ) O(n) O(n)时间复杂度的移除数组元素的算法的if条件里的逻辑的从右向左覆盖移动改成从左向右交换元素移动就很快写出来,代码再贴一遍(顺利通过):

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        //模仿O(n)的删除数组元素的方法删除0
        //if条件由nums[fast]!=val改成nums[fast]!=0
        //但是这次不是仅仅nums[slow]=nums[fast],而是将它们两个交换
        int slow = 0;
        int temp = 0;//临时变量存储交换值
        for(int fast = 0; fast < nums.size(); fast++)
        {
            if(nums[fast]!=0)
            {
                //交换元素位置
                temp = nums[slow];
                nums[slow] = nums[fast];
                nums[fast] = temp;
                slow++;
            }
        }
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Docker】docker部署lnmp和wordpress网站

环境准备 docker&#xff1a;192.168.67.30 虚拟机&#xff1a;4核4G systemctl stop firewalld systemctl disable firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add…

vue2主体页面进行拆分

目录 一.组件化 二.新建Header.vue页面 三.Aside.vue代码 四.Main.vue代码如下 五.Home.vue代码如下 六.index.js代码如下&#xff1a; 七.项目效果图 在Vue.js 2中&#xff0c;将主体页面进行拆分是一种常见的做法&#xff0c;它有助于提高代码的可维护性和可读性。页面…

js实现简单的级联下拉列表

代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><script src"js/jquery.min.js" type"text/javascript" charset"utf-8"></script><st…

Linux的磁盘分区,格式化,挂载

1.需要提前添加几个磁盘&#xff0c;以做实验 2.把nvme0n2磁盘用来分区实验 3.分了一个主分区&#xff0c;和一个扩展分区&#xff08;扩展分区是不能使用的&#xff0c;所以又在扩展分区里分了一个逻辑分区&#xff09;分区的大小自己定义 4.格式化分出来的区&#xff0c;这…

618不可错过的数码好物精选!等等党必看清单汇总

无论是追求高效工作的职场人士&#xff0c;还是热爱科技、追求品质生活的消费者&#xff0c;都希望能找到那些既实用又富有创新精神的数码好物&#xff0c;现在正值618购物狂欢节来临之际&#xff0c;我精心为大家挑选了一份不可错过的数码好物清单&#xff0c;这份清单不仅汇聚…

App一键直达,Xinstall助力提升用户体验

在这个移动互联网时代&#xff0c;App已经成为了我们日常生活中不可或缺的一部分。然而&#xff0c;每当我们在浏览器或社交平台上看到一个有趣的App推荐&#xff0c;点击下载后却往往要经历一系列繁琐的跳转和确认过程&#xff0c;这无疑大大降低了用户体验。那么&#xff0c;…

数据结构 - C/C++

快速跳转 数组链表栈队列串树 目录 数据结构 逻辑结构 物理结构 数据结构 数据 数据不仅仅包括整型、实型等数值类型&#xff0c;还包括字符及声音、图像、视频等非数值类型。 计算机可以理解并按照指定格式处理。 结构 元素相互之间存在一种或多种特定关系的数据集合。 …

Git 常用命令大全

&#x1f680; Git安装与基础知识学习 &#x1f310; &#x1f3af; Git作为一款全球开发者广泛使用的分布式版本控制系统&#xff0c;能够有效帮助团队协作并追踪项目历史版本。接下来&#xff0c;我们将详细展开Git的安装流程、基础命令操作、高级用法以及应对常见问题的方法…

西湖大学赵世钰老师【强化学习的数学原理】学习笔记1节

强化学习的数学原理是由西湖大学赵世钰老师带来的关于RL理论方面的详细课程&#xff0c;本课程深入浅出地介绍了RL的基础原理&#xff0c;前置技能只需要基础的编程能力、概率论以及一部分的高等数学&#xff0c;你听完之后会在大脑里面清晰的勾勒出RL公式推导链条中的每一个部…

信息系统集成对企业的影响到底有多大?

什么是信息系统集成 系统集成&#xff08;System Integration&#xff09;是指将若干个独立运作的系统或服务联通并整合的过程&#xff0c;旨在将那些存在交集或重复功能的分散模块融合为一个协同工作的整体&#xff0c;以实现效能的最大化和资源的最优配置&#xff0c;避免不…

找不到mfc140u.dll文件如何处理?这三种方法帮你快速修复mfc140u.dll

当你的电脑出现提示&#xff0c;显示找不到mfc140u.dll文件&#xff0c;从而无法继续执行代码&#xff0c;你需要知道如何应对这种情况。今天我们就来详细说明如何解决mfc140u.dll文件丢失的问题&#xff0c;并对该文件进行详细分析。这个文件是Microsoft Visual Studio的一个重…

AI文章写作网站

最强AI文章写作网站——心语流光&#xff08; Super Ai Writer &#xff09; 特点 多轮问答写作&#xff0c;自动携带历史记录进行问答可以自定义携带历史记录的轮数&#xff0c;为0则携带全部历史记录&#xff0c;有效避免token浪费&#xff08;类似coze平台&#xff09;AI生…

【Java网络编程】TCP通信(Socket 与 ServerSocket)和UDP通信的三种数据传输方式

目录 1、TCP通信 1.1、Socket 和 ServerSocket 1.3、TCP通信示例 2、UDP的三种通信&#xff08;数据传输&#xff09;方式 1、TCP通信 TCP通信协议是一种可靠的网络协议&#xff0c;它在通信的两端各建立一个Socket对象 通信之前要保证连接已经建立&#xff08;注意TCP是一…

【06】JAVASE-数组讲解【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

从业务经营到企业战略,构建制药企业数字化应用新能力

我国医药的消费正处在一个高速增长的阶段&#xff0c;人口增长、老龄化加剧、经济总体增长、人均消费增长、农村收入提高&#xff0c;这五大因素是医药市场蓬勃发展的动力。在这五大因素的驱动下&#xff0c;我国的医药市场需求将会在未来相当长的时间内保持高速增长。从多个环…

神经网络:手写数字图像识别

一、导入相关库函数 import matplotlib.pyplot as plt import tensorflow as tf import keras import numpy as np 二、载入mnist数据集 使用keras.中的mnist数据集 (train_images, train_labels), (test_images, test_labels)\ keras.datasets.mnist.load_data() 三、测…

在微信上卖化妆品怎样发圈(学会写朋友圈段子卖货很简单)

大家好&#xff0c;我是只说人话&#xff0c;不讲概念&#xff0c;专给创业者们开思维脑洞 今天咱们要分享的内容比较有趣&#xff0c;教你如何写段子故事在朋友圈里做促销活动。 首先我们来看一个硬蹭明星热点的朋友圈案例。发朋友圈的是一位做装修的&#xff0c;在明星结婚的…

Python AI库 Pandas的常见操作的扩展知识

Python AI库 Pandas的常见操作的扩展知识 本文默认读者具备以下技能&#xff1a; 熟悉python基础知识&#xff0c;vscode或其它编辑工具 熟悉表格文件的基本操作 具备自主扩展学习能力 前文中对Pandas的数据结构以及基础操作做了介绍,本文中会在前文的基础上,对常见的操作进…

Python自动化系统6

元素的特征:根据页面设计规则&#xff0c;有些特征是唯一 开发遵循了这个规则 id :类比身份证号―仅限于当前页面 username username 注意:如果id 不是固定的话&#xff0c;就不能使用来定位! xpath: 1、绝对路径&#xff1a;/html/body/div/div/div[1]/a/b --根节点&#xff…

2024公共管理与社会发展国际学术会议(ICPMSD 2024)

2024公共管理与社会发展国际学术会议(ICPMSD 2024) 2024 International Conference on Public Management and Social Development 一、【会议简介】 2024公共管理与社会发展国际学术会议&#xff0c;将汇集全球顶尖学者&#xff0c;展开一场学术盛宴。 在这次会议上&#xff0…