算法刷题:移动零

移动零

  • .
  • 题目链接
  • 详解
    • cur
    • desc
    • 算法原理
  • 答案

.

算法刷题:移动零_第1张图片

题目链接

移动零

详解

题目要求我们要把数组中所有的零都移动到数组的末尾,且要求其余数字顺序不改变.这道题,我们使用到的是双指针算法:
利用两个指针,将数组分为三个部分,
算法刷题:移动零_第2张图片
三个区间分别为

  1. [0,desc]
  2. [desc+1,cur-1]
  3. [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;
    }
}

你可能感兴趣的:(算法)