雙指針:283. 移動零

 

 分析題目:

  • 將0移動到末尾
  • 保持原有數字順序
  • 要in-place

看到這個題目,想到了計數排序的方式,數數有多少個0,放在後面。這點總是沒有問題的。

 

老是記着原來好像見過類似的題目,由此產生思路:

把數組分爲:無零數區,0區,未篩選區

 

 

 兩個指針,一個指向0區的開頭位置(pZero),一個指向未篩選區的開頭位置(pNum)

如果發現pNum指向爲0,pNum直接右移即可

如果發現pNum指向數,和pZero值交換位置,指針都右移即可

重點是把0區放在“中間”,而不是最後的區域,那樣是很不適合做交換的。

然而我搞得麻煩了一點,pNum當然初值設置爲0,但按照這個圖的思想,把pZero初始值設置爲-1

這樣對於pZero爲-1時還需要特判,搞得好像有點麻煩:

class Solution {
    public void moveZeroes(int[] nums) {
        int pZero=-1,pNum=0;
        while(pNum<nums.length)
        {
            if(nums[pNum]==0)
            {
                if(pZero==-1)
                {
                    pZero=pNum;
                    pNum++;
                }
                else
                {
                    pNum++;
                }
                
            }
            else if(nums[pNum]!=0)
            {
                if(pZero==-1)
                {
               
                    pNum++;
                }
                else
                {
                    nums[pZero]=nums[pNum];
                    nums[pNum]=0;
                    pZero++;
                    pNum++;
                }
            }
        }

    }
}

 有更加簡潔的算法,但是我覺得還是我這個比較易懂,倒是可以把num++提出來,然後就只剩下兩個判斷分支了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章