给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
进阶: 你能尽量减少完成的操作次数吗?
思路:
- 双指针,将所有非0元素按顺序整理到数组左段,
- i:快指针扫描数组的所有元素,j:慢指针,用来指向替换后的数组的位置。
- 当 i 扫描到的是非 0 元素,则 nums[j++] = nums[i],j,i 同时向后移动,当 i 扫描到的是 0,则只有 i 向后移动。
- 最后将 j 指针后面的所有位置 置0,相当于将所有 0 移到数组后面。
时间复杂度:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int j = 0;
for(int i = 0; i < nums.size(); i++){
if(nums[i] != 0) nums[j++] = nums[i];
}
while(j < nums.size()) nums[j++] = 0;
}
};