给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
使用双指针,把nums当作栈
var moveZeroes = function(nums) {
let slow=0
for(let fast =0;fast<nums.length;fast++){
if(nums[fast]!==0){
nums[slow]=nums[fast]
slow++
}
}
nums.fill(0,slow)
};
-
使用
fast遍历数组所有元素,slow指向放非零元素的位置。 -
当遍历完后,
slow之后的位置全部填0。
双指针+交换元素
使用方案一,最坏情况的时间复杂度还是 O(2n) ≈ O(n),也可以用原地交换的方式:
- 只用一个循环,遇到非零元素时,直接和
slow位置交换,然后slow++ - 不需要额外的
fill
var moveZeroes = function(nums) {
let slow=0
for(let fast =0;fast<nums.length;fast++){
if(nums[fast]!==0){
[nums[slow],nums[fast]]=[nums[fast],nums[slow]]
}
}
};