【LeetCode】题解 - 283. 移动零

从‘能看’到‘好看’:用Seaborn调色板让你的热力图在PPT和论文中脱颖而出 本文探讨如何利用Seaborn调色板提升热力图在PPT和论文中的视觉效果,从视觉心理学和场景适配角度出发,提供学术与商业场景下的配色方案和实战代码。通过优化色彩选择,使数据可视化更具专业性和吸引力,帮助读者快速理解关键信息。 阅读详情

从博主英雄哪里出来 - 万人千题 - 社区混了 9 天,今日出关,向英雄学习,写 LeetCode 题解报告,和算法正式杠上,争取开个花。

欢迎还没下定决心和算法正面刚的人,尝试 【九日集训】,Maybe 后续可能就没了。


283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

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

示例 2:

输入: nums = [0]
输出: [0]

数据提示:

  • 1 <= nums.length <= 10^4
  • -2^31 <= nums[i] <= 2^31 - 1

进阶:你能尽量减少完成的操作次数吗?

在这里插入图片描述

解法1:借助 vector<int> nonZeroNums; 非原地操作

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        vector<int> nonZeroNums;
        int N = nums.size();

        // 将非 0 元素放到 nonZeroNums 中
        for(int i=0; i<N; i++) {
            if(nums[i]) {
                nonZeroNums.push_back(nums[i]);
            }
        }
        
        // 将 nonZeroNums 中非 0 元素放回 nums
        int M = nonZeroNums.size();
        for(int i=0; i<M; i++) {
            nums[i] = nonZeroNums[i];
        }

        // 将 nums 中 [M, N) 区间元素置 0 
        for(int i=M; i<N; i++) {
            nums[i] = 0;
        }
    }
};

解法2:使用循环不变量(👈个人记忆点),优化 O(N) 空间。

  1. 规定 [0, k) 存储非 0 元素,k 初始为 0 ,保证 [0, k) 开始时,区间长度为 0;
  2. 遍历,将 nums[i] 非 0 元素复制给 nums[k];
  3. 区间 [k, i) 中元素置 0;
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        // 维护好循环中的循环不变量,有利于写出边界正确的代码
        int k = 0;  // nums中,[0, k) 区间元素均为 非0 元素,k 初始为 0,保证区间为空

        // 遍历到第 i 个元素后,保证 [0, i] 中所有元素均已经循序排列在 [0, k) 中
        for(int i=0; i<nums.size(); i++) {
            if(nums[i]) {
                nums[k] = nums[i];
                k ++;
            }
        }

        // 将 nums 剩余的位置设为 0  [k, nums.size())
        for(int i=k; i<nums.size(); i++) {
            nums[i] = 0;
        }
    }
};

解法2 - 优化1,向 进阶 要求尝试,减少操作的次数

  • 遍历时,将非 0 元素 nums[i] 和 nums[k] 交换,省去 [k, i) 区间的置 0 操作
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        // 维护好循环中的循环不变量,有利于写出边界正确的代码
        int k = 0;  // nums中,[0, k) 区间元素均为 非0 元素,k 初始为 0,保证区间为空

        // 遍历到第 i 个元素后,保证 [0, i] 中所有元素均已经循序排列在 [0, k) 中
        for(int i=0; i<nums.size(); i++) {
            if(nums[i]) {
            	// 优化 1
                swap(nums[k++], nums[i]);
            }
        }
    }
};

解法2 - 优化2 进一步优化 nums[i] 和 nums[k] 的swap操作

  • nums[i] !=0 时,若[0, i] 区间元素均不为 0, 则i = k ,此时的交换操作无效,设置条件,仅在 nums[i] != 0 且 i != k 时,才交换。
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        // 维护好循环中的循环不变量,有利于写出边界正确的代码
        int k = 0;  // nums中,[0, k) 区间元素均为 非0 元素,k 初始为 0,保证区间为空

        // 遍历到第 i 个元素后,保证 [0, i] 中所有元素均已经循序排列在 [0, k) 中
        for(int i=0; i<nums.size(); i++) {
            if(nums[i]) {
                if(i != k) {	// 优化 2
                    swap(nums[k], nums[i]);
                }
                k ++;
            }
        }
    }
};
Xilinx高级调试方法--远程调试 本文主要介绍Xilinx的一些高级调试方法,以及如何使用Xilinx的相关IP。 阅读详情

相关推荐

医疗器械软件测试输出内容(1)

*单元测试(Unit Testing):**单元测试是软件测试的最底层,用于验证软件中最小的可测试单元——函数、方法或模块。系统测试是在集成测试之后进行的,它对整个系统进行测试,验证系统在不同部分集成在一起后是否满足需求和规格。: 集成测试是在单元测试之后进行的,它关注不同单元之间的交互和集成。对于不同安全级别的软件(IEC 62304 A类、B类、C类),在体系上要求输出的文件内容有所区别。**说明:**将集成测试和软件系统测试合并为一项单一的计划和一组活动是可接收的。

ct745363083的博客 1867

Leetcode——283.移动零——题解+代码实现

一、题目 给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 二、题解思路 题解思路:遍历数组nums,遇到非零元素,就把这个非零元素往前赋值,(例如:遇到第一个非零元素就把他赋值给数组的第一位...

鬼刀 383

HFSS的边界条件与激励方式

在电磁场理论学习中我们知道,电磁场问题的求解都归结于麦克斯韦(Maxwell)方程组的求解,在HFSS中波动方程的求解同样是由微分形式的麦克斯韦方程推导出来的。而边界条件定义了求解区域的边界以及不同物体交界处的电磁场特性,是求解麦克斯韦方程的基础。 只有在假定场矢量是单值、有界、并且沿空间连续分布的前提下,微分形式的麦克斯韦方程组才是有效的;而在求解区域的边界,不同介质的交界处和场源处,场矢量是不连续的,那么场的导数也就失去了意义。 边界条件就是定义跨越不连续边界处的电磁场特性,因此,正确地理解、定义并

ASH_GUARDIAN的博客 1万+

【双指针】专题:LeetCode 283题解——移动零

LeetCode 283题解 | 移动零

2401_87255690的博客 1248

因果推断(二):因果推断涉及的ITE、ATE、CATE等效应

因果效应也称为**处理效应(Treatment effect)**是用于评判干预与否的结果差异的指标(处理变量对结果变量的影响)。比如在接受治疗组中,如果这些人不接受治疗,这组人接受治疗和不接受治疗的效应差异是多少。定义为实验组中每个个体的处理效应差异,比如一个个体在接收治疗和不接受治疗的两个处理方式的健康程度得分的差。但是一个人因为不可能。比如我们想探究接受治疗的男性用户和不接受治疗的男性用户的平均效果差异就是CATE。前面说ITE是无法观测的,是因为一个人不能同时接受治疗又不接受治疗,这里关键的就是。

Y1n的博客 3713

快充协议全兼容!HUSB390对比测试:iPhone/小米/华为哪个充电最快?

本文深入评测了HUSB390快充协议芯片的全兼容性能,展示了其在iPhone、小米和华为设备上的极速充电表现。通过智能功率分配算法和多协议并行处理引擎,HUSB390实现了高效的动态调压和温度控制,显著提升多设备充电效率。特别适合需要同时为不同品牌设备快充的用户。

dd012的博客 1万+

LeetCode283.移动零题解

小编今天写到一道蛮有趣的题目...(哎并不是有趣只是反复摔坑罢了TT)

2501_94301877的博客 327

核磁分析必备,ACD/Labs软件使用全解析

核磁共振(NMR)是化学分析中的重要工具,而ACD/Labs提供了一套强大的软件解决方案。从实验设计到数据解读,ACD/Labs 的 NMR 预测可以显著加快您的工作流程。使用 ACD/NMR 预测可以:根据化学结构预测 1H、13C、15N、19F 和 31P 核的全套 1D 和 2D NMR 光谱;在几秒钟内计算化学位移和耦合常数;利用内部数据训练算法,提高新化学空间的准确性。

a13981820402的博客 5635

LeetCode 283 移动零 题解

LeetCode 283 移动零 题解方法1 双指针方法2 快排思想 LeetCode链接 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 方法1 双指针 自己写的这个双指针的竟然还挺官方哈哈哈 class Solution { public void moveZeroes(int[] nums) {

qq_39618369的博客 339

智能车轮腿组‘定点排雷’科目全解析:从雷区识别到姿态控制

本文深入解析了智能车竞赛轮腿穿越组‘定点排雷’科目的核心技术。从构建鲁棒的视觉识别系统,到融合编码器与IMU进行厘米级定位,再到实现框内高精度旋转的姿态控制,提供了一套完整的从感知到执行的闭环技术方案,助力参赛队伍攻克这一高难度科目。

weixin_29161719的博客 640

RGB接口电容触摸屏驱动(二)接口与时序说明

RGB接口电容触摸屏驱动(二)接口与时序说明

杰克拉力船长个人博客 4920

LeetCode题解-python 283.移动零 Move Zeroes (Easy)

LeetCode题解-python283.移动零 Move Zeroes (Easy)用python比较简单github题目代码(python3) 283.移动零 Move Zeroes (Easy) 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作...

LKY111的专栏 311

YOLOv8改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用

本文记录的是利用双级路由注意力机制优化的目标检测网络模型。传统的复杂度高,随着输入空间分辨率增加,计算量呈平方增长,导致严重的可扩展性问题。而本文所使用的在获取全局信息的同时,通过区域到区域路由和令牌到令牌注意力的合理设计,减少了不必要的计算量。BiFormer: Vision Transformer with Bi-Level Routing Attention采用四阶段金字塔结构,与一些先进的视觉Transformer类似。在每个阶段,首先使用重叠的补丁嵌入(在第一阶段)或补丁合并模块(在第二到第四阶段

Limiiiing的博客 614

[LeetCode] 283.移动零 题解

遍历过程中,若当前元素非零,则将其赋值到idx指向的位置,并将 idx 后移。遍历完成后,所有非零元素已有序排列在数组前半段,从 idx 开始到数组末尾的所有位置统一置 0。快指针遇到非零元素时,与慢指针位置的元素进行交换,保证非零元素前移。协同遍历,快指针负责寻找非零元素,慢指针标记当前待替换的零元素位置,每找到一个非零元素便与慢指针位置交换,实现非零元素前移与零元素后移的同步完成。给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。的情况下原地对数组进行操作。

2501_92746740的博客 192

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【leetcode283】移动零 Java题解

【leetcode分类下所有的题解均为作者本人经过权衡后挑选出的题解,在易读和可维护性上有优势 每题只有一个答案,避免掉了太繁琐的以及不实用的方案,所以不一定是最优解】 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减...

illusion 297

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LeetCode题解---<283.移动零>

本文提出了一种使用双指针原地移动数组零元素的方法。通过维护两个指针i和j,当j指针遇到非零元素时,将其移动到i指针位置并同时移动两个指针;遇到零元素时仅移动j指针。遍历完成后,所有非零元素已按原顺序排列在前部,剩余位置补零即可。该方法时间复杂度为O(n),仅需一次遍历且无需额外空间,满足题目原地操作的要求。关键点在于利用双指针区分处理非零元素和零元素,既保持了非零元素的相对顺序,又高效地完成了零元素的移动。

zj_203240104的博客 267

力扣283集:移动零题解

我是阿扎,致力于写算法题解,希望我的题解可以帮到大家 道阻且长,行则将之 力扣283题移动零题解 数组,双指针

2402_87803758的博客 157

LeetCode 283:移动零(双指针问题) —— 题解

双指针——移动零

2601_96587588的博客 566

leetcode 283. 移动零 题解

题目描述: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/move-zeroes 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解题思路: 从后往前遍历,遇到0则删除元素,借用js的splice方法,使用规则为nums.splice(in.

yuanyuan_HTML的博客 218

Leetcode 283. 移动零 题解

题目链接:https://leetcode-cn.com/problems/move-zeroes/ 快慢指针,快指针找到一个非零元素,就换到当前慢指针指向位置,慢指针右移,快指针右移;否则只有快指针右移。最后将慢指针右侧所有元素都置0 代码如下: class Solution { public: void moveZeroes(vector<int>& nums) ...

BNDSllx的博客 190

283. 移动零--力扣题解

题目描述: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序 方法一: 思路:先遍历一次数组,计算数组中0的个数 再次遍历数组,把非零元素放到前面,然后把数组后面的元素用0填充 class Solution { public void moveZeroes(int[] nums) { int count = 0; for (int i=0;i< nums.length;i++){ i

山中有木的博客 508

leetcode283移动零java题解(计数法)

1.题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例:输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/move-zeroes 2.想法 (1)用冒泡...

老简单题 243

LeetCode 283. 移动零【c++/java详细题解】

目录1、题目2、思路3、c++代码4、java代码 1、题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 2、思路 (双指针) O(n)O(n)O(n) 给定一个数组 nums,要求我们将所有的 0 移动到数组的末尾,同时保持非零元素的相对顺序。 样例: 如样例所示,数组nums = [0,1,0,3,

林深不见鹿 的博客 1633

LeetCode题解:283. 移动零,JavaScript,一次遍历,详细注释

原题链接:https://leetcode-cn.com/problems/move-zeroes/ 参考题解了动画演示 283.移动零的一次遍历解法。 解题思路: 快指针遍历数组。慢指针表示存放非0元素的位置 快指针遍历到非0元素时,将其移动到慢指针位置,并将慢指针加1 时间复杂度:O(n) 空间复杂度:O(1) /** * @param {number[]} numbers * @return {void} Do not return anything, modify numbers in-pl

Lee Chen的博客 248

LeetCode题解 => 283.移动零(五十四)

移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 这一版使用了额外的数组,所以需要进一步优化 时间复杂度:O(n)。但是,操作仍然是局部优化的。代码执行的总操作(数组写入)为 nn(元素总数)。 ...

余光的博客 1348

leetcode 283.移动零题解

leetcode 283.移动零

weixin_43959239的博客 170

leetcode题解 283.移动零(Typescript)

leetcode题解 283.移动零(Typescript)

qq_58671479的博客 241
上一篇: 【JavaSE基础】01-Java 基础语法
下一篇: [学习报告]《LeetCode零基础指南》(第一讲) 函数
老坛算粉
博客等级 码龄12年 708粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老坛算粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值