-
2.5
- 忘了逻辑了:不管 fast 是不是 0 都要 fast++,不管是不是等于,都要 slow++
-
1.22
- 忘了temp 取得是 num【fast】了,而不是 fast 数组下标
class Solution {
public void moveZeroes(int[] nums) {
int slow = 0;
int fast = 0;
while(fast!=nums.length){
if(nums[fast]!=0){
if(slow!=fast){
int temp =nums[slow];
nums[slow] = nums[fast];
nums[fast] = temp;
}
slow++;
}
fast++;
}
}
}双指针在一起的情况
- 1.6
- 快慢指针,慢指针留着位置放好书,快指针扫描好书扔给慢指针,只有快指针遇到非零元素,进入判断,快慢指针是否相等,如果位置不相等,说明中间隔着 0
[1, 0, 2]- 只要 快指针 和 慢指针 不相等,就说明 快指针 曾经跨越过
0,而 慢指针 正指着那个0(或者一串0的第一个),等着现在的这个非零数nums[快指针]来把这个0换走。
- 只要 快指针 和 慢指针 不相等,就说明 快指针 曾经跨越过
结合你的例子 [1, 0, 2] 看代码执行:
-
遇到 1 (非零):
-
fast发现是 1。 -
swap(自己换自己)。 -
slow往前走(slow变成 1)。 -
fast往前走(fast变成 1)。 -
此时
slow和fast都在下标 1。
-
-
遇到 0:
-
fast发现是 0。 -
if进不去 →slow没有动! (停在下标 1,等着接书)。 -
fast继续往前走(fast变成 2)。 -
此时
slow=1,fast=2。距离拉开了!
-
-
遇到 2 (非零):
-
fast发现是 2。 -
if进去了。 -
swap:把nums[fast](也就是 2) 扔给nums[slow](下标 1 的位置)。 -
slow往前走。 -
fast往前走。
-
总结: 跑得快、负责遍历的是 fast (i);跑得慢、负责占坑的是 slow (j)。
class Solution {
public void moveZeroes(int[] nums) {
int slow = 0;
int fast =0;
while(fast<nums.length){
if(nums[fast]!=0){
if(fast!=slow){
int temp = nums[slow];
nums[slow] = nums[fast];
nums[fast] = temp;
}
slow++;//只有快指针找到非零元素,慢指针才会往前走,它始终指向**“下一个非零元素应该摆放的位置”**。
}
fast++;
}
}
}