105 lines
3.6 KiB
Markdown
105 lines
3.6 KiB
Markdown
|
||
<p align="center">
|
||
<a href="https://mp.weixin.qq.com/s/RsdcQ9umo09R6cfnwXZlrQ"><img src="https://img.shields.io/badge/PDF下载-代码随想录-blueviolet" alt=""></a>
|
||
<a href="https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw"><img src="https://img.shields.io/badge/刷题-微信群-green" alt=""></a>
|
||
<a href="https://space.bilibili.com/525438321"><img src="https://img.shields.io/badge/B站-代码随想录-orange" alt=""></a>
|
||
<a href="https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ"><img src="https://img.shields.io/badge/知识星球-代码随想录-blue" alt=""></a>
|
||
</p>
|
||
<p align="center"><strong>欢迎大家<a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
|
||
# 动态规划:一样的套路,再求一次完全平方数
|
||
|
||
# 283. 移动零
|
||
|
||
题目链接:https://leetcode-cn.com/problems/move-zeroes/
|
||
|
||
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
|
||
|
||
示例:
|
||
|
||
输入: [0,1,0,3,12]
|
||
输出: [1,3,12,0,0]
|
||
说明:
|
||
|
||
必须在原数组上操作,不能拷贝额外的数组。
|
||
尽量减少操作次数。
|
||
|
||
|
||
# 思路
|
||
|
||
做这道题目之前,大家可以做一做[27.移除元素](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww)
|
||
|
||
这道题目,使用暴力的解法,可以两层for循环,模拟数组删除元素(也就是向前覆盖)的过程。
|
||
|
||
好了,我们说一说双指针法,大家如果对双指针还不熟悉,可以看我的这篇总结[双指针法:总结篇!](https://mp.weixin.qq.com/s/PLfYLuUIGDR6xVRQ_jTrmg)。
|
||
|
||
双指针法在数组移除元素中,可以达到O(n)的时间复杂度,在[27.移除元素](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww)里已经详细讲解了,那么本题和移除元素其实是一个套路。
|
||
|
||
**相当于对整个数组移除元素0,然后slowIndex之后都是移除元素0的冗余元素,把这些元素都赋值为0就可以了**。
|
||
|
||
如动画所示:
|
||
|
||

|
||
|
||
C++代码如下:
|
||
|
||
```CPP
|
||
class Solution {
|
||
public:
|
||
void moveZeroes(vector<int>& nums) {
|
||
int slowIndex = 0;
|
||
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
|
||
if (nums[fastIndex] != 0) {
|
||
nums[slowIndex++] = nums[fastIndex];
|
||
}
|
||
}
|
||
// 将slowIndex之后的冗余元素赋值为0
|
||
for (int i = slowIndex; i < nums.size(); i++) {
|
||
nums[i] = 0;
|
||
}
|
||
}
|
||
};
|
||
```
|
||
|
||
# 其他语言版本
|
||
|
||
Java:
|
||
|
||
```java
|
||
public void moveZeroes(int[] nums) {
|
||
int slow = 0;
|
||
for (int fast = 0; fast < nums.length; fast++) {
|
||
if (nums[fast] != 0) {
|
||
nums[slow++] = nums[fast];
|
||
}
|
||
}
|
||
// 后面的元素全变成 0
|
||
for (int j = slow; j < nums.length; j++) {
|
||
nums[j] = 0;
|
||
}
|
||
}
|
||
```
|
||
|
||
Python:
|
||
|
||
```python
|
||
def moveZeroes(self, nums: List[int]) -> None:
|
||
slow = 0
|
||
for fast in range(len(nums)):
|
||
if nums[fast] != 0:
|
||
nums[slow] = nums[fast]
|
||
slow += 1
|
||
for i in range(slow, len(nums)):
|
||
nums[i] = 0
|
||
```
|
||
|
||
Go:
|
||
|
||
JavaScript:
|
||
|
||
-----------------------
|
||
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
|
||
* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
|
||
|
||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码.jpg width=450> </img></div>
|