问题

283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

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

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

分析

  • 使用交换0和非0元素的方式,实现所有0都到末尾。
  • 关键点在于确定什么时候交换。

最优解之一:

说明: 索引i用来遍历数组;索引j用来“始终”指向0元素的位置,j在交换过之后,直接+1,使其一直指向0的元素。特殊情况在于初始位置(i=0, j=0)时,如数组arr若是[7,0,3,0,9]时,第一次交换arr[i=0] 和arr[j=0],即自己跟自己交换了下,交换完后,j=j+1指向了0的元素位置。区别与去除有序数组中重复元素的算法:这里是:1)比较是否等0;2)不等0就先交换;3)再移动指针(索引j)。 去除有序数组中重复元素的算法是1)比较与前一个元素是否相等,2)不等先移动指针(索引j),3)再直接覆盖重复元素。

动画演示:

代码:

#include <stdio.h>
#include <iostream>
#include <vector>void moveZeroToEnd(std::vector<int>& nums)
{int j = 0;int tmp = 0;for (int i = 0; i < nums.size(); ++i){if (nums[i] != 0){tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;++j;}}
}

测试:

int main(int argc, char* argv[])
{std::vector<int> ver = { 0,7,3,0,9 };moveZeroToEnd(ver);for (int i = 0; i < ver.size(); ++i){std::cout << ver[i] << " ";}return 0;
}

输出结果:

注意:Ubuntu16.04下默认使用的g++ 使用的是c++98规范, 不支持vector的直接赋值初始化。需修改~/.bashrc文件

参考:https://blog.csdn.net/midi666/article/details/83151729

时间复杂度分析:

因为这里只用到了交换,所以时间复杂度是O(n), 空间复杂度没有用到数组相关,所以是O(1).

参考:极客时间

力扣: https://leetcode-cn.com/problems/move-zeroes/

算法笔记_面试题_2.移动零(将数组的的0元素移到末尾)相关推荐

  1. [转载] JAVA笔记_(Day04,Day05)函数数组

    参考链接: 了解Java中的数组IndexOutofbounds异常 文章目录 函数定义练习误区重载(overload)重载选择题练习函数的内存调用问题 数组定义数组的内存图解数组的常见问题应用求和最 ...

  2. 第2章KNN算法笔记_函数classify0

    <机器学习实战>知识点笔记目录 K-近邻算法(KNN)思想: 1,计算未知样本与所有已知样本的距离 2,按照距离递增排序,选前K个样本(K<20) 3,针对K个样本统计各个分类的出现 ...

  3. 回溯 皇后 算法笔记_算法笔记_04_回溯

    设计思想: (1)适用:求解搜索问题和优化问题. (2)搜索空间:数,节点对应部分解向量,可行解在树叶上. (3)搜索过程:采用系统的方法隐含遍历搜索树. (4)搜索策略:深度优先,宽度优先,函数优先 ...

  4. 回溯 皇后 算法笔记_回溯算法:N皇后问题

    给「代码随想录」一个星标吧! ❝ 通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便 ...

  5. 算法笔记_183:历届试题 九宫重排(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成 ...

  6. 算法笔记_172:历届试题 波动数列(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度 ...

  7. 回溯 皇后 算法笔记_什么叫回溯算法,一看就会,一写就废

    什么叫回溯算法 对于回溯算法的定义,百度百科上是这样描述的:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回, ...

  8. 算法笔记_188:历届试题 危险系数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点 ...

  9. 回溯 皇后 算法笔记_算法笔记-回溯法

    (1)0-1背包问题 思路:构造一个二叉树,每个商品都有两种状态,要或者不要.如果要就在这个节点的左枝挂子节点,如果不要就在右节点挂子节点.如果全部商品都分配完状态之后就回溯,回溯到一个还有其他选择的 ...

  10. 算法笔记_图算法专题_关键路径 AOV网和AOE网

    关键路径 1.基本概念 1.AOV网:顶点活动网,是指用顶点表示活动,而用边集表示活动优先关系的有向无环图. 2.AOE网:边活动网,是指用带权的边集表示活动,而用顶点表示事件的有向无环图. AOV网 ...

最新文章

  1. [转] 背完这444句,你的口语绝对不成问题了
  2. android MotionEvent
  3. spring aop源码实现分析
  4. 使用CountDownLatch来模拟马拉松比赛
  5. cross component navigation in HCP
  6. openpyxl 读写 excel
  7. vue 项目文件介绍
  8. 这是 1000 万程序员都想要的格子衫!
  9. 安装SQL2005示例数据库
  10. 发那科机器人接线电源_电源开关上的L1和L2是不是火线和零线?
  11. 【外星眼halcon教程】机器视觉测量消费电子显示屏的颜色
  12. MATLAB函数拟合指令,MATLAB拟合函数使用说明
  13. 【OTDR曲线工具箱】02 OTDR测量曲线查看
  14. 2019上半年系统集成项目管理工程师真题与答案
  15. mysql删除一行_MySql删除表中一行的实操方法
  16. 《莎士比亚》文本生成
  17. CSS+SVG实现简单的点赞效果
  18. 抖音获取douyin分享口令url API 返回值说明
  19. dataframe列时间字段提取年、月、日、时、分
  20. 第十周 项目一 计算税后收入

热门文章

  1. mysql插入数据显示:Incorrect datetime value: '0000-00-00 00:00:00'
  2. 20165320 第六周学习总结
  3. c++11 实现半同步半异步线程池
  4. 上手DocumentDB On Azure (二)
  5. xxx系统的6大质量属性战术
  6. asp.net中使用水晶报表 ---pull
  7. 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action
  8. 生产环境中的PHP WEB 简单架构
  9. Asp.net中把DataTable或DataGrid导出为Excel
  10. Java中File类的separator属性