启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
该题是数组移除元素题型第三题。
题目来源
题目描述(简单)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例1
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例2
输入: nums = [0]
输出: [0]
提示
题目解析
如果是可以添加新数组,可以通过循环遍历获得所有非零元素依次添加到新数组,最后在补 0 补齐与原数组长度相同即可。
在只能对原数组操作的前提下,便可以采用双指针的思路。
明确快慢指针的用处:
- 慢指针:作为处理好序列的尾部
- 快指针:作为待处理序列的头部
此题中双指针与 LeetCode —— 27. 移除元素 - 掘金 (juejin.cn) 该题最大区别在于,此题中快指针找到非零元素时,快慢指针对应的元素互换,同时快慢指针右移,反之,只有快指针右移。
注意: 可能有小伙伴觉得为什么要元素互换呢,直接慢指针对应元素等于快指针对应元素,然后快指针对应元素等于 0 不行吗,这时候需要考虑到 [1] 这种情况,这时慢指针不是指向零元素,因此只能使用元素互换才行。
双指针
代码
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let slow = 0, fast = 0
while (fast < nums.length){
if (nums[fast] === 0){
fast++
}else{
let val = nums[fast]
nums[fast] = nums[slow]
nums[slow] = val
slow++
fast++
}
}
return nums
};
- 时间复杂度:
- 空间复杂度:
如图:
执行用时和内存消耗仅供参考,大家可以多提交几次。如有更好的想法,欢迎大家提出。