
思路:双指针(快慢指针)
初始状态:i (fast)指向当前遍历的元素 ; j (slow)表示下一个非0元素存放的位置


-
时间复杂度:O(n),其中 n 为序列长度。每个位置至多被遍历两次。
-
空间复杂度:O(1)。只需要常数的空间存放若干变量。
public void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0) {
return;
}
int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {
if (nums[fast] != 0) {
if (slow != fast) { // 减少赋值的次数
nums[slow] = nums[fast];
}
slow++;
}
}
for (; slow < nums.length; slow++) {
nums[slow] = 0;
}
}
该篇博客介绍了如何运用双指针技巧解决数组中移动零元素的问题。通过设置快慢两个指针,可以在遍历一次数组的同时,将非零元素前移,保持数组中非零元素连续,而所有零元素则被集中到数组末尾。算法的时间复杂度为O(n),空间复杂度为O(1)。示例代码展示了具体的实现过程。
8万+

被折叠的 条评论
为什么被折叠?



