LeetCodeAnimation/notes/LeetCode第283号问题:移动零.md
2019-05-02 16:23:13 +08:00

137 lines
3.6 KiB
Java
Raw 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.

# LeetCode 283 号问题移动零
> 本文首发于公众号五分钟学算法[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
题目来源于 LeetCode 上第 283 号问题移动零题目难度为 Easy目前通过率为 53.8%
### 题目描述
给定一个数组 `nums`编写一个函数将所有 `0` 移动到数组的末尾同时保持非零元素的相对顺序
**示例:**
```
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
```
**说明**:
1. 必须在原数组上操作不能拷贝额外的数组
2. 尽量减少操作次数
### 题目解析
设定一个临时变量 k = 0遍历数组 nums 将非零元素移动到 nums[k] 同时 k++而后将k,.nums.size()中的元素置零
### 解法一
创建一个临时数组 nonZeroElements 遍历 nums nums 中非 0 元素赋值到 nonZeroElements中而后按顺序将 nonZeroElements 赋值到 nums 未遍历的元素置 0
动画如下
![](https://bucket-1257126549.cos.ap-guangzhou.myqcloud.com/20181027160100.gif)
代码如下
```
// 时间复杂度: O(n)
// 空间复杂度: O(n)
class Solution {
public:
void moveZeroes(vector<int>& nums) {
vector<int> nonZeroElements;
// 将vec中所有非0元素放入nonZeroElements中
for(int i = 0 ; i < nums.size() ; i ++)
if(nums[i])
nonZeroElements.push_back(nums[i]);
// 将nonZeroElements中的所有元素依次放入到nums开始的位置
for(int i = 0 ; i < nonZeroElements.size() ; i ++)
nums[i] = nonZeroElements[i];
// 将nums剩余的位置放置为0
for(int i = nonZeroElements.size() ; i < nums.size() ; i ++)
nums[i] = 0;
}
};
```
### 解法二
设定一个临时变量 k = 0遍历数组 nums 将非零元素移动到 nums[k] 位置同时 k++而后将k,.nums.size()中的元素置零
动画如下
![](https://bucket-1257126549.cos.ap-guangzhou.myqcloud.com/20181027160135.gif)
代码如下
```
// 原地(in place)解决该问题
// 时间复杂度: O(n)
// 空间复杂度: O(1)
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int k = 0; // nums中, [0...k)的元素均为非0元素
// 遍历到第i个元素后,保证[0...i]中所有非0元素
// 都按照顺序排列在[0...k)中
for(int i = 0 ; i < nums.size() ; i ++)
if(nums[i])
nums[k++] = nums[i];
// 将nums剩余的位置放置为0
for(int i = k ; i < nums.size() ; i ++)
nums[i] = 0;
}
};
```
### 解法三
思路设定一个临时变量 k = 0遍历数组 nums将非零元素与之前的零元素进行交换维护变量k的值
动画如下
![](https://bucket-1257126549.cos.ap-guangzhou.myqcloud.com/20181030085904.gif)
代码如下
```
// 原地(in place)解决该问题
// 时间复杂度: O(n)
// 空间复杂度: O(1)
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int k = 0; // nums中, [0...k)的元素均为非0元素
// 遍历到第i个元素后,保证[0...i]中所有非0元素
// 都按照顺序排列在[0...k)中
// 同时, [k...i] 为 0
for(int i = 0 ; i < nums.size() ; i ++)
if(nums[i]){
if(k != i){
swap(nums[k++] , nums[i]);
}else{
k ++;
}
}
}
};
```
![](https://bucket-1257126549.cos.ap-guangzhou.myqcloud.com/blog/fz0rq.png)