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

news2024/12/24 11:34:28

题目地址

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++;
            }
        }
    }
};

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

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

相关文章

小程序使用阿里巴巴矢量图标库

一、登录官网 www.iconfont.cn 二、在搜索框中搜索想要的图标&#xff0c;将鼠标移动到图标上会看到三个标记 可以使用下载&#xff0c;直接使用&#xff1a; 可以使用css文件使用&#xff1a; 首先点击购物车样式的选项&#xff0c;而后点击下图位置&#xff1a; 点击自己创…

嵌入式Linux学习——Linux常用命令(上)

Linux命令行介绍 Linux Shell 简介 Shell 的意思是“外壳”&#xff0c;在 Linux 中它是一个程序&#xff0c;比如/bin/sh、/bin/bash 等。它负责接收用户的输入&#xff0c;根据用户的输入找到其他程序并运行。比如我们输入“ ls”并回车时&#xff0c; shell 程序找到“ ls…

Kafka 3.x.x 入门到精通(06)——Kafka进阶

Kafka 3.x.x 入门到精通&#xff08;06&#xff09;&#x1f449;&#x1f449;&#x1f449;&#x1f449; Kafka进阶 3. Kafka进阶3.1 Controller选举3.2 Broker上线下线3.3 数据偏移量定位3.4 Topic删除3.5 日志清理和压缩3.7 页缓存3.8 零拷贝3.9 顺写日志3.10 Linux集群部…

循环购模式:电商消费增值的新引擎

大家好&#xff0c;我是微三云周丽&#xff01; 在数业模式和创新的营销策字经济的浪潮下&#xff0c;电商行业以其独特的商略&#xff0c;不断刷新着消费者的购物体验。 近年来&#xff0c;循环购模式作为一种新兴的电商消费增值模式&#xff0c;逐渐在市场中崭露头角&#…

上门服务系统|上门服务小程序搭建流程

随着科技的不断进步和人们生活水平的提高&#xff0c;越来越多的服务开始向线上转型。传统的上门服务业也不例外&#xff0c;随着上门服务小程序的兴起&#xff0c;人们的生活变得更加便捷和高效。本文将为大家介绍上门服务小程序的搭建流程以及应用范围。 一、上门服务小程序搭…

知名专业定制线缆生产源头工厂推荐-精工电联:线缆行业的质量与成本双赢

知名专业定制线缆生产源头工厂推荐-精工电联 在当今科技飞速发展的时代&#xff0c;企业要想在激烈的市场竞争中立于不败之地&#xff0c;必须具备高质量、高效率、低成本的核心竞争力。作为线缆制造领域的领先者&#xff0c;精工电联始终秉持“与智者同行&#xff0c;与制造为…

“AI技能,新的职场通行证?揭秘阿里最新职业趋势报告“

随着“五一”劳动节的临近&#xff0c;阿里巴巴发布了一份引人注目的报告——《“AI”职业趋势报告》。这份报告不仅揭示了人工智能&#xff08;AI&#xff09;在各行各业中的关键作用&#xff0c;也预示了一个全新的工作时代正在加速到来。 报告中明确指出&#xff0c;AI的应用…

探索和构建 LLaMA 3 架构:深入探讨组件、编码和推理技术(四)分组多查询注意力

探索和构建 LLaMA 3 架构&#xff1a;深入探讨组件、编码和推理技术&#xff08;四&#xff09;分组多查询注意力 Grouped-query Attention&#xff0c;简称GQA 分组查询注意力&#xff08;Grouped-query Attention&#xff0c;简称GQA&#xff09;是多查询和多头注意力的插值…

栈和队列OJ——括号匹配问题,用队列实现栈,用栈实现队列,设计循环队列

题目1——括号匹配问题 题目来源. - 力扣&#xff08;LeetCode&#xff09; 思路——辅助栈法 括号匹配问题是一个经典的计算机科学问题&#xff0c;常用于检查一个字符串中的括号是否正确匹配。这包括各种括号&#xff0c;如小括号“()”&#xff0c;大括号“{}”&#xff0…

Eagle for Mac:强大的图片管理工具

Eagle for Mac是一款专为Mac用户设计的图片管理工具&#xff0c;旨在帮助用户更高效、有序地管理和查找图片资源。 Eagle for Mac v1.9.2中文版下载 Eagle支持多种图片格式&#xff0c;包括JPG、PNG、GIF、SVG、PSD、AI等&#xff0c;无论是矢量图还是位图&#xff0c;都能以清…

你的网站还在使用HTTP? 免费升级至HTTPS吧

如果您的网站还在使用老的http协议&#xff0c;可以申请一个免费的SSL证书升级至https&#xff01; 具体步骤如下&#xff1a; 1 申请免费SSL证书 根据你的需求选择合适的SSL证书类型&#xff0c;如单域名证书&#xff0c;多域名证书、通配符证书 登录免费供应商JoySSL官网&…

18 JavaScript学习:错误

JavaScript错误 JavaScript错误通常指的是在编写JavaScript代码时发生的错误。这些错误可能是语法错误、运行时错误或逻辑错误。以下是对这些错误的一些常见分类和解释&#xff1a; 语法错误&#xff1a; 这类错误发生在代码编写阶段&#xff0c;通常是由于代码不符合JavaScrip…

排队叫号取号投屏语音播报小程序开源版开发

排队叫号取号投屏语音播报小程序开源版开发 多场景排队叫号系统&#xff0c;支持大屏幕投屏&#xff0c;语音播报叫号&#xff0c;可用于餐厅排队取餐、美甲店排队取号、排队领取、排队就诊、排队办理业务等诸多场景&#xff0c;助你轻松应对各种排队取号叫号场景。 功能特性…

IBM SPSS Statistics for Mac v27.0.1中文激活版:强大的数据分析工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析工具&#xff0c;为Mac用户提供了高效、精准的数据分析体验。 IBM SPSS Statistics for Mac v27.0.1中文激活版下载 该软件拥有丰富的统计分析功能&#xff0c;无论是描述性统计、推论性统计&#xff0c;还是高级的多元统计…

C++进阶--智能指针

智能指针的概念 智能指针是C中的一个重要概念&#xff0c;用于管理动态分配的对象内存。它是一个类模板&#xff0c;通过封装原始指针&#xff0c;并在对象生命周期结束时自动释放内存&#xff0c;从而避免了内存泄漏和资源管理的繁琐工作。 C标准库提供了多种常见的智能指针…

MySQL常见问题与解决方案详述

MySQL&#xff1a;常见问题与解决方案详述 作为一款广泛使用的开源关系型数据库管理系统&#xff0c;MySQL对于初学者来说既充满吸引力又充满挑战。本文将列举初学者在使用MySQL过程中可能遇到的一些典型问题&#xff0c;并提供详细的解决方案&#xff0c;配以图片辅助说明&am…

Visual Studio 对 C++ 头文件和模块的支持

在 C 编程领域&#xff0c;头文件和模块的管理有时候确实比较令人头疼。但是&#xff0c;有许多工具和功能可以简化此过程&#xff0c;提高效率并减少出错的可能性。下面是我们为 C 头文件和模块提供的几种工具的介绍。 构建明细 通过菜单栏 Build > Run Build Insights&a…

Eudic欧路词典for Mac:专业英语学习工具

Eudic欧路词典for Mac&#xff0c;作为专为Mac用户设计的英语学习工具&#xff0c;凭借其简捷高效的特点&#xff0c;成为众多英语学习者不可或缺的助手。 Eudic欧路词典for Mac v4.6.4激活版下载 这款词典整合了多个权威词典资源&#xff0c;如牛津、柯林斯、朗文等&#xff0…

低代码技术的全面应用:加速创新、降低成本

引言 在当今数字化转型的时代&#xff0c;企业和组织面临着不断增长的应用程序需求&#xff0c;以支持其业务运营和创新。然而&#xff0c;传统的软件开发方法通常需要大量的时间、资源和专业技能&#xff0c;限制了企业快速响应市场变化和业务需求的能力。在这样的背景下&…

杰发科技AC7840——CAN通信简介(7)_波形分析

参考&#xff1a; CAN总线协议_stm32_mustfeng-GitCode 开源社区 0. 简介 隐形和显性波形 整帧数据表示 1. 字节描述 CAN数据帧标准格式域段域段名位宽&#xff1a;bit描述帧起始SOF(Start Of Frame)1数据帧起始标志&#xff0c;固定为1bit显性(b0)仲裁段dentify(ID)11本数…