算法笔记_面试题_2.移动零(将数组的的0元素移到末尾)
问题
283. 移动零
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入:[0,1,0,3,12]
输出:[1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
分析
- 使用交换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元素移到末尾)相关推荐
- [转载] JAVA笔记_(Day04,Day05)函数数组
参考链接: 了解Java中的数组IndexOutofbounds异常 文章目录 函数定义练习误区重载(overload)重载选择题练习函数的内存调用问题 数组定义数组的内存图解数组的常见问题应用求和最 ...
- 第2章KNN算法笔记_函数classify0
<机器学习实战>知识点笔记目录 K-近邻算法(KNN)思想: 1,计算未知样本与所有已知样本的距离 2,按照距离递增排序,选前K个样本(K<20) 3,针对K个样本统计各个分类的出现 ...
- 回溯 皇后 算法笔记_算法笔记_04_回溯
设计思想: (1)适用:求解搜索问题和优化问题. (2)搜索空间:数,节点对应部分解向量,可行解在树叶上. (3)搜索过程:采用系统的方法隐含遍历搜索树. (4)搜索策略:深度优先,宽度优先,函数优先 ...
- 回溯 皇后 算法笔记_回溯算法:N皇后问题
给「代码随想录」一个星标吧! ❝ 通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便 ...
- 算法笔记_183:历届试题 九宫重排(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成 ...
- 算法笔记_172:历届试题 波动数列(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度 ...
- 回溯 皇后 算法笔记_什么叫回溯算法,一看就会,一写就废
什么叫回溯算法 对于回溯算法的定义,百度百科上是这样描述的:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回, ...
- 算法笔记_188:历届试题 危险系数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点 ...
- 回溯 皇后 算法笔记_算法笔记-回溯法
(1)0-1背包问题 思路:构造一个二叉树,每个商品都有两种状态,要或者不要.如果要就在这个节点的左枝挂子节点,如果不要就在右节点挂子节点.如果全部商品都分配完状态之后就回溯,回溯到一个还有其他选择的 ...
- 算法笔记_图算法专题_关键路径 AOV网和AOE网
关键路径 1.基本概念 1.AOV网:顶点活动网,是指用顶点表示活动,而用边集表示活动优先关系的有向无环图. 2.AOE网:边活动网,是指用带权的边集表示活动,而用顶点表示事件的有向无环图. AOV网 ...
最新文章
- [转] 背完这444句,你的口语绝对不成问题了
- android MotionEvent
- spring aop源码实现分析
- 使用CountDownLatch来模拟马拉松比赛
- cross component navigation in HCP
- openpyxl 读写 excel
- vue 项目文件介绍
- 这是 1000 万程序员都想要的格子衫!
- 安装SQL2005示例数据库
- 发那科机器人接线电源_电源开关上的L1和L2是不是火线和零线?
- 【外星眼halcon教程】机器视觉测量消费电子显示屏的颜色
- MATLAB函数拟合指令,MATLAB拟合函数使用说明
- 【OTDR曲线工具箱】02 OTDR测量曲线查看
- 2019上半年系统集成项目管理工程师真题与答案
- mysql删除一行_MySql删除表中一行的实操方法
- 《莎士比亚》文本生成
- CSS+SVG实现简单的点赞效果
- 抖音获取douyin分享口令url API 返回值说明
- dataframe列时间字段提取年、月、日、时、分
- 第十周 项目一 计算税后收入
热门文章
- mysql插入数据显示:Incorrect datetime value: '0000-00-00 00:00:00'
- 20165320 第六周学习总结
- c++11 实现半同步半异步线程池
- 上手DocumentDB On Azure (二)
- xxx系统的6大质量属性战术
- asp.net中使用水晶报表 ---pull
- 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action
- 生产环境中的PHP WEB 简单架构
- Asp.net中把DataTable或DataGrid导出为Excel
- Java中File类的separator属性