当前位置: 首页 > news >正文

【LeetCode刷题之路】283:移动零的普通解法与优化解法(含动图演示)

在这里插入图片描述

LeetCode刷题记录
  • 🌐 我的博客主页:iiiiiankor
  • 🎯 如果你觉得我的内容对你有帮助,不妨点个赞👍、留个评论✍,或者收藏⭐,让我们一起进步!
  • 📝 专栏系列:LeetCode 刷题日志
  • 🌱 文章内容来自我的学习与实践经验,如果你有任何想法或问题,欢迎随时在评论区交流讨论。让我们一起探索更多的可能!🚀

文章目录

    • 📜题目描述
    • 💡解题思路


📜题目描述

给定一个数组 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

在i位置遇到0,把后面的元素向前移动覆盖,然后把最后一个位置赋值为0即可

注意问题:

  • 可能 i 一个位置 移动一次之后还是0,需要循环

  • 有可能 i 位置的0 是因为 已经所有的0都到后面了

    ​ 所以需要用count记录0的个数,当所有0都移动完了就break,否则会死循环

LeetCode283 移动0
代码1
在这里插入图片描述


解法2 (效率高)

双指针法

  1. end去找非0,放到src位置

  2. 最后end走到numsSize,src位置就是最后一个非0的下一个位置

  3. 把src后面的置0

LeetCode283 移动0 双指针法
最后:

image-20220702195150657
代码2
在这里插入图片描述

解法2优化:不用memset,直接在过程中交换

当end位置为非0的时候

其实可以直接把src位置和end位置的元素进行交换

如图:
可以发现 src和end交换的过程就是一直把0向后换

LeetCode283 移动0 双指针法1

如果数组没有0

那么src和end一直自己交换,也是正确的!

LeetCode283 移动0 双指针法2

总结:

src和end位置交换

  • 要么就是把0向后换
  • 要么就是自己与自己交换

代码3

在这里插入图片描述


http://www.mrgr.cn/news/78713.html

相关文章:

  • 代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值 、 347.前 K 个高频元素
  • Unity 对Sprite或者UI使用模板测试扣洞
  • Agent智能体之:2025 一文掌握 AI Agent全部技术栈。
  • Unity热更文件比较工具类
  • 服务器systemctl命令使用与go项目zero框架中实战
  • 选课(贪心)
  • 常用函数的使用错题汇总
  • Qt入门5——常用控件3
  • 第七课 Unity编辑器创建的资源优化_UI篇(UGUI)
  • Java八股文(11-29start)
  • MySQL源码编译
  • baomidou Mabatis plus引入异常
  • 【设计模式系列】解释器模式(十七)
  • 关于使用注册表修改键盘的键位映射
  • 阿里云服务器(centos7.6)部署前后端分离项目
  • 六:安装服务-compute node
  • 1-1 Gerrit实用指南
  • 【LeetCode刷题之路】120:三角形最小路径和的两种解法(动态规划优化)
  • 初识ProtoBuf以及环境搭建(Win和Ubuntu)
  • NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比
  • 你能穿过迷雾看清一切吗
  • uni-app 使用笔记
  • 【Oracle】个人收集整理的Oracle常用SQL及命令
  • BUGKU printf
  • otter 扩展
  • Ubuntu 24.04使用docker安装Node-Red