leecode/problems/283.move-zeroes.md
2020-05-22 18:17:19 +08:00

100 lines
2.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 题目地址
https://leetcode.com/problems/move-zeroes/description/
## 题目描述
```
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.
Example:
Input: [0,1,0,3,12]
Output: [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.
```
## 思路
如果题目没有要求 modify in-place 的话,我们可以先遍历一遍将包含 0 的和不包含 0 的存到两个数组,
然后拼接两个数组即可。 但是题目要求 modify in-place 也就是不需要借助额外的存储空间,刚才的方法
空间复杂度是 O(n).
那么如果 modify in-place 呢? 空间复杂度降低为 1。
我们可以借助一个游标记录位置,然后遍历一次,将非 0 的原地修改,最后补 0 即可。
## 关键点解析
## 代码
* 语言支持JS, C++, Python
JavaScript Code:
```js
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let index = 0;
for(let i = 0; i < nums.length; i++) {
const num = nums[i];
if (num !== 0) {
nums[index++] = num;
}
}
for(let i = index; i < nums.length; i++) {
nums[index++] = 0;
}
};
```
C++ Code
> 解题思想与上面 JavaScript 一致,做了少许代码优化(非性能优化,因为时间复杂度都是 O(n)
> 增加一个游标来记录下一个待处理的元素的位置,这样只需要写一次循环即可。
```C++
class Solution {
public:
void moveZeroes(vector<int>& nums) {
vector<int>::size_type nonZero = 0;
vector<int>::size_type next = 0;
while (next < nums.size()) {
if (nums[next] != 0) {
// 使用 std::swap() 会带来 8ms 的性能损失
// swap(nums[next], nums[nonZero]);
auto tmp = nums[next];
nums[next] = nums[nonZero];
nums[nonZero] = tmp;
++nonZero;
}
++next;
}
}
};
```
Python Code:
```python
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
slow = fast = 0
while fast < len(nums):
if nums[fast] != 0:
nums[fast], nums[slow] = nums[slow], nums[fast]
slow += 1
fast += 1
```