LeetCode笔记:Move Zeros[Difficulty: Easy]
来源:互联网 发布:阿凡达妹妹实力知乎 编辑:程序博客网 时间:2024/04/27 15:13
原题:
Given an array nums
, write a function to move all 0
's to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12]
, after calling your function, nums
should be [1, 3, 12, 0, 0]
.
Note:
- You must do this in-place without making a copy of the array.
- Minimize the total number of operations.
译:
给定一个数组,写一个函数将所有的0移动到它尾部,同时要保持非零元素的相对次序。例如:给定nums = [0, 1, 0, 3, 12], 在调用函数后,nums应该变成:[1, 3, 12, 0, 0]提示:
1. 你应该在同一区域进行操作(同址运算)而不是拷贝数组
2. 最小化操作总数
思路:
看到这道题我的第一印象没有特别“算法”的思路,于是就形象地把数组想成一个容器,装着许多离散的气泡(数字0)和水(非0数),将它竖起来,然后气泡会上升,水会下沉。有了如下想法:
定义一个“重力”变量g(与实际物理意义无关),初始化为0。从底往上,遇到水,下沉g个单位,原处变为气泡;遇到气泡,g增加一个单位。
//第一版本 使用c++class Solution {public:void moveZeroes(vector<int>& nums) {//暂时没有更好方案int g = 0;//“重力” 空隙越大 “重力”越大for (int i = 0; i < nums.size(); i++){if (nums[i]==0){g++;}else if(g){nums[i - g] = nums[i];//下坠nums[i] = 0;}}}};
通过结果如下:
还没想明白前面那一小撮是怎么做到的,觉得不服,于是用C实现了一遍,并且重新理性理解了思路,减少了对g的判断。
void moveZeroes(int* nums, int numsSize) {<span style="white-space:pre"></span>int g = 0;//“标记距离”越远 返回越远<span style="white-space:pre"></span>int j = 0;//“标记点”<span style="white-space:pre"></span>while (nums[j] && j < numsSize)j++;<span style="white-space:pre"></span>for (int i = j; i < numsSize; i++){<span style="white-space:pre"></span>if (nums[i]==0)<span style="white-space:pre"></span>g++;//增加标记距离<span style="white-space:pre"></span>else{<span style="white-space:pre"></span>nums[j++] = nums[i];//移回标记点<span style="white-space:pre"></span>nums[i] = 0;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}}Runtime如下:
一直以为C是效率之王,我却看见java在这里快得没边。
后来看了别人写得Java最快代码,才知道思路是相同的。只是不知道为何差距为什么那么大,不过平台不同,相比也没多少意义吧。
第一次写博客,看官见笑。
0 0
- LeetCode笔记:Move Zeros[Difficulty: Easy]
- 【leetcode】283. Move Zeros
- Leetcode Move Zeros
- (java)leetcode Move Zeros
- move zeros leetcode
- 【leetcode】:move zeros
- leetcode Move Zeros
- leetcode之move zeros
- leetcode之 Move Zeros
- leetcode:Move Zeros
- 283.[LeetCode]Move Zeros
- LeetCode: Move Zeros
- leetCode:283.Move Zeros
- Leetcode 283 Move zeros
- leetcode【283 Move Zeros】【python】
- 【leetcode】Move Zeroes[easy]
- [LeetCode练习题-C语言]之 Move Zeros
- LeetCode 283. Move Zeros 解题报告
- iOS webView 小用法
- Git忽略规则及.gitignore规则不生效的解决办法
- hdu1710 Binary Tree Traversals
- [Guava源码日报]Guava类库简介
- 【安装虚拟机和linux系统ubuntu14.04遇到的问题】
- LeetCode笔记:Move Zeros[Difficulty: Easy]
- ZOJ 2770 Burn the Linked Camp【差分约束 SPFA】
- 【IPC】管道和FIFO
- leetcode-65-Valid Number
- 中里巴人-求医不如求己(健康好书)
- HDU Wooden Sticks
- Mac OS Locate 查找文件指令
- iOS陆先森开发随笔(四)tablview点击push到下一个页面,pop出来时位置下移问题
- 构造函数,重载方法,继承