【Hot100算法刷题集】双指针-01-移动零(含置零思路、移动思路、偏移量思路、冒泡法)

在这里插入图片描述

🏠关于专栏:专栏用于记录LeetCode中Hot100专题的所有题目
🎯每日努力一点点,技术变化看得见

题目转载

题目描述

🔒link->题目跳转链接
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

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

题目示例

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

示例 2:
输入: nums = [0]
输出: [0]

题目提示

1 1 1 <= nums.length <= 1 0 4 10^4 104
− 2 31 -2^{31} 231 <= nums[i] <= 2 31 − 1 2^{31} - 1 2311

解题思路及代码

非移动(置零)思路&&双指针解法

题目的意思是,将所有的零移动到整个数组的最后面。这里先介绍非移动的解题逻辑:使用一个下标dst保存当前最后一个非零元素的下一个位置的下标,当遍历元素nums[cur]时,如果nums[cur]非零,则执行nums[++dst]=nums[cur]操作;cur遍历完nums后,借助dst将dst之后的元素置零。

这里就是将非零元素都保存到nums数组的前面,再将剩下的位置置零。
在这里插入图片描述

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

移动思路&&双指针解法

使用dst记录最后一个非零元素的下标,cur记录当前遍历到的元素的下标。若nums[cur]==0,则不需要进行任何操作,若nums[cur]!=0,则需要swap(nums[++dst], cur)。这里的思路是,如果遇到的是非零元素,则交换到0到dst之间,那么(dst,cur]之间就都是0。下方两张图是对该思路的演示,使用的是示例1:[0, 1, 0, 3, 12]。
在这里插入图片描述
在这里插入图片描述

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

偏移量法

在上面一个解法中,(dst, cur]之间都是0,那么我们可以定义一个变量offset记录0的个数。当遍历到nums[cur]==0时,则++offset;否则执行swap(nums[cur], nums[offset])的操作。这个思路用示例解释更为清晰,下方图是对示例1:[0, 1, 0, 3, 12]执行该方法的演示。
在这里插入图片描述
这个方法的最主要的就是这个offset变量,它记录了0的个数,因而cur-offset就能找到距离cur最远的一个0,从而进行交换时,就能将非0元素换到最左0元素的位置上。

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

冒泡法

上述算法的时间复杂度均为 O ( N ) O(N) O(N),而这里有个效率低下,但值得一探究竟的算法——冒泡法。这个思路就是冒泡排序,如果当前元素是0,通过不断将0元素交换到最后。每一次执行内层循环的目的就是为了将一个0元素交换到最后。但这个算法效率过低,效率为 O ( N 2 ) O(N^2) O(N2),建议作为了解即可。

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

刷题使我快乐😭
文章如有错误,请私信或在下方留言😀

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

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

相关文章

企业数字化转型建设方案(数据中台、业务中台、AI中台)(可编辑的188页WORD)

引言&#xff1a;企业数字化转型是一个复杂而长期的过程&#xff0c;其核心在于通过数据中台、业务中台和AI中台的建设&#xff0c;推动企业实现全面的数字化升级。 方案介绍&#xff1a;企业数字化转型建设方案中的数据中台是企业数字化转型的核心基础设施&#xff0c;负责数…

Stream流的思想和获取Stream流

首先介绍流的概念&#xff1a; 流可以理解为一条流水线&#xff0c;在这条流水线中有许多操作&#xff0c;比如筛选所需要的数据&#xff0c;输出打印等&#xff0c; 经过这条流水线&#xff0c;可以获取到自己所需要的数据&#xff1a; -->所以&#xff1a; Stream流的作…

java项目之疫情下图书馆管理系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的疫情下图书馆管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息。 项目简介&#xff1a; 疫情下图书馆管理系…

USB虚拟串口——CDC ACM 虚拟串口(不使用 IAD)

文章目录 CDC ACM 虚拟串口实现描述符结构设备描述符配置描述符集合配置描述符接口 1 的描述符接口描述符类特殊描述符输入端点描述符接口 2 的描述符接口描述符输出端点描述符输入端点描述符类特殊请求set control line statusget line codingset line codingCDC 数据交互主机…

VirtualBox Install MacOS

环境搭建 git clone https://github.com/myspaghetti/macos-virtualbox 脚本配置 修改macos-guest-virtualbox.sh部分内容为 vm_name"macOS" # name of the VirtualBox virtual machine macOS_release_name"Catalina" # install &quo…

基于springboot的二手物品管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的二手物品管理系统9拥有三种角色 管理员&#xff1a;用户管理、卖家管理、分类管理、商品管理、订单管理、求购管理、留言管理等 用户&#xff1a;登录注册、购买、收藏、…

宴会中的白酒品鉴技巧,让你成为焦点人物

在宴会中&#xff0c;一杯白酒往往能成为连接人与人之间的纽带&#xff0c;而掌握白酒品鉴技巧&#xff0c;则能让你在觥筹交错间成为众人瞩目的焦点。今天&#xff0c;我们就来谈谈宴会中的白酒品鉴技巧&#xff0c;以豪迈白酒&#xff08;HOMANLISM&#xff09;为例&#xff…

ESP32开发 -- 初识

一、ESP32官网 ESP32官网 二、文档下载 用的是ESP32-S3-MINI-1&#xff0c;官网查看相关文档 相关文档 三、技术规格书 四、开发板 参看&#xff1a;ESP32-S3 系列开发板 ESP32-S3-MINI-1 相关开发板的示例代码&#xff0c;后续可以参考。 Espressif Systems esp-dev-…

BMP图片与VGA(HDMI)时序互转

1.BMP介绍 BMP&#xff08;Bitmap&#xff09;是一种用于存储位图图像的文件格式&#xff0c;广泛应用于 Windows 操作系统中。BMP 文件可以存储高质量的图像数据&#xff0c;包括颜色深度较高的图片&#xff0c;同时支持无压缩或可选的简单压缩方式。 BMP格式&#xff1a; …

【运维资料】网络监控运维管理解决方案(PPT原件完整版)

构建一体化运维监控平台的核心策略涵盖了几个关键维度&#xff0c;旨在打造一个高效、灵活且稳定的系统管理体系。首要任务是确立清晰的监控目标&#xff0c;这要求深入理解业务需求&#xff0c;确保监控范围覆盖关键性能指标、服务状态及潜在风险点。随后&#xff0c;整合现有…

Qt Model/View之代理

概念 与模型-视图-控制器模式不同&#xff0c;模型/视图设计没有包含一个完全独立的组件来管理与用户的交互。通常&#xff0c;视图负责向用户展示模型数据&#xff0c;并负责处理用户输入。为了在获取输入的方式上具有一定的灵活性&#xff0c;交互由委托执行。这些组件提供输…

C++---内存管理

1 C/C内存分布 栈区&#xff1a;由编译器自动分配和释放&#xff0c;存放运行时候的局部变量&#xff0c;函数参数&#xff0c;返回数据&#xff0c;返回地址。 堆区&#xff1a;一般由程序员自己分配&#xff0c;然后自己释放&#xff0c;例如栈的实现malloc开辟的数组空间。…

中秋假期用向日葵,临时工作需求远程控制随时解决

不知你是否在这美好时刻赏月看灯&#xff1f;有没有收到公司发的月饼呢&#xff1f; 在如今这个讲究降本增效的时代&#xff0c;仪式感早已变得稀少。公司发的月饼还没拆开&#xff0c;新消息就已弹出在公司群里。 此刻心里仿佛有万马奔腾&#xff0c;但很快又如湖水般平静&am…

拒绝千篇一律,AI帮你定制独一无二的个人写真

每个女人都渴望展现最美的自己&#xff0c;你是否厌倦了拍出千篇一律的照片&#xff1f;今天&#xff0c;我要告诉你一个秘密&#xff0c;用简单三步&#xff0c;即可打造属于你的独一无二个人写真&#xff01;文生图、蒙版换脸、图生图&#xff0c;三步化身超级模特&#xff0…

基于TRIZ的救援机器人轻量化设计

在救援机器人设计中&#xff0c;轻量化是一个至关重要的目标&#xff0c;它直接关系到机器人的便携性、运输效率以及在复杂环境中的作业能力。TRIZ理论为我们提供了一套系统化的工具和方法&#xff0c;用于解决设计过程中遇到的各种挑战&#xff0c;特别是在实现轻量化目标时&a…

初识爬虫4

1.理解代理ip&#xff0c;正向代理和反向代理 2.代理ip分类&#xff0c;根据匿名度分类&#xff1a;透明&#xff0c;匿名&#xff0c;高匿 3.防止频繁向同一个域名发送请求被封ip,需使用代理ip # -*- coding: utf-8 -*- import requestsurl https://www.baidu.comproxies {…

从关键新闻和最新技术看AI行业发展(第三十一期2024.8.26-9.8) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对其中的关键信息进行解读&#xff0c;力求让读者们能从容掌握AI科技潮流。 欢迎大家关注Rocky的公众号&#xff1a;WeThinkIn 欢迎大家关注Rocky的知乎&#xff1a;Rocky Ding AIGC算…

微型导轨加工环境需避免的隐患!

微型导轨是一种小巧精密的线性定位解决方案&#xff0c;其高速度、低噪音的特点使得它在现代制造业中扮演着越来越重要的角色。而微型导轨对于加工环境的要求主要体现在以下几个方面&#xff1a; 1、温度控制&#xff1a;加工环境需要保持在适宜的温度范围内&#xff0c;过高或…

一分钟教你 全平台隔空投送文件 LoaclSend保姆级教程

主要内容 什么是LoaclSend 详细步骤 1.下载LoaclSend 2.使用MoleSDN 异地访问 3.一切就绪&#xff0c;打开LocalSend 发送文件 什么是LoaclSend 一款开源的文件传输工具&#xff0c;旨在提供简单、安全、快速的本地文件传输。 LocalSend可以免费使用且无需注册登录&…

音视频直播应用场景探讨之RTMP推流还是GB28181接入?

技术背景 好多开发者跟我们沟通音视频解决方案的时候&#xff0c;不清楚什么时候用RTMP推送模块&#xff0c;什么时候用GB28181设备接入模块&#xff0c;也不清楚二者差异化。实际上&#xff0c;RTMP推流和GB28181接入模块&#xff0c;在很多方面存在差异&#xff0c;如应用领…