移动零
- .
- 题目链接
- 详解
- cur
- desc
- 算法原理
- 答案
.
题目链接
移动零
详解
题目要求我们要把数组中所有的零都移动到数组的末尾,且要求其余数字顺序不改变.这道题,我们使用到的是双指针算法:
利用两个指针,将数组分为三个部分,
三个区间分别为
- [0,desc]
- [desc+1,cur-1]
- [cur,n-1]
在0到cur-1之间,表示已经校验的部分
cur
因为cur指针是用来遍历整个数组的,那么它的初始值应该为0,且以n-1为末值.
desc
因为desc表示的是非零元素的最后一个数,那么它在一开始是没有非零的数字的,所以这里给它赋值为-1,
算法原理
当nums[cur]==0时,只需要使得cur++,因为这样正好可以使得cur的左边是已校验的零区域
当nums[cur]!=0时,为了满足上面的三个区域,应该将当前非零值放在非零值区域的最后一个,也就是desc+1处,而且desc+1处的数字正好也是零区域的第一个,所以,将nums[cur]与nums[desc+1]进行交换,然后将cur与desc进行+1操作,这样就又使得数组满足了上面的三个区域的条件
答案
class Solution {
public void moveZeroes(int[] nums) {
int cur = 0;
int desc = -1;
while(cur<nums.length){
if(nums[cur]!=0){
swap(nums,desc+1,cur);
desc++;
}
cur++;
}
}
public void swap(int[]nums,int a ,int b){
int tmp = nums[a];
nums[a]=nums[b];
nums[b]=tmp;
}
}