问题描述
给定一个数组nums,编写一个函数将所有0移到数组的末尾,同时保持非零元素的相对顺序。
例如, 输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
解决方案
可以先将非0元素移动到前面,再在末尾补全0。
function moveZeroes(nums: number[]): void {
let j = 0;
for(let i = 0; i < nums.length; i++) {
if(nums[i] !== 0) {
nums[j] = nums[i];
j++;
}
}
while(j < nums.length) {
nums[j] = 0;
j++;
}
}
时间复杂度:O(n)。需要遍历整个数组,但每个元素只会被处理一次,因此时间复杂度为 O(n)。
空间复杂度:O(1)。只需要常数级别的额外空间来保存变量。
总结
本题不同于一般的排序算法,它要求我们只移动0,而不是交换位置,因此解决方案也有所不同。通过双指针,可以快速将数组中的非零元素移动到前面,再用0补全末尾即可。时间复杂度和空间复杂度都较低,是一种比较优秀的解决方案。