LeetCode.283移动零
- 1.问题描述
- 2.解题思路
- 3.代码
1.问题描述
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
2.解题思路
双指针
- 设置两个指针指向开头元素。一个fast指针,一个slow指针
- fast指针向右移动,如果元素为0,不执行操作,向右移动,如果元素不为0,将fast指针所指元素,移到slow指针所在的位置,slow指针向右移动一位
- 当fast指针向右移动出界之后,将当前slow指针指向元素及其之后元素设置为0
3.代码
python:双指针
class Solution {
public:
void moveZeroes(vector<int>& nums) {
// 设置一个变量,用来指向经过一系列操作后数组中所有为 0 元素的第一个位置上
// 一开始默认在索引为 0 的位置
int slow = 0;
for (int fast = 0; fast < nums.size(); fast++) {
// 在遍历过程中,如果发现访问的元素是非 0 元素
// 说明 slow 不在正确的位置上,需要向后移动,寻找合适的位置
if (nums[fast] != 0) {
// 这个时候,原先 slow 的值需要被 fast 的值覆盖
nums[slow] = nums[fast];
// slow 需要向后移动,寻找合适的位置
slow++;
}
}
// 接下来,只需要把 slow 极其后面所有的元素都设置为 0 就行
for (int i = slow; i < nums.size(); i++) {
nums[i] = 0;
}
}
};
C++:双指针
class Solution {
public:
void moveZeroes(vector<int>& nums) {
// 设置一个变量,用来指向经过一系列操作后数组中所有为 0 元素的第一个位置上
// 一开始默认在索引为 0 的位置
int slow = 0;
for (int fast = 0; fast < nums.size(); fast++) {
// 在遍历过程中,如果发现访问的元素是非 0 元素
// 说明 slow 不在正确的位置上,需要向后移动,寻找合适的位置
if (nums[fast] != 0) {
// 这个时候,原先 slow 的值需要被 fast 的值覆盖
nums[slow] = nums[fast];
// slow 需要向后移动,寻找合适的位置
slow++;
}
}
// 接下来,只需要把 slow 极其后面所有的元素都设置为 0 就行
for (int i = slow; i < nums.size(); i++) {
// 都设置为 0
nums[i] = 0;
}
}
};