2021-01-01 605

SuperFeHanHan發表於2021-01-02

605 種花問題

思路1:

實際上可以用2標記當前為1的元素的左右元素,找最長的連續為0的區域[a,b],然後用 f l o o r ( b − a + 1 2 ) + 1 floor(\frac{b-a+1}{2})+1 floor(2ba+1)+1

思路2:

我們每次碰到一個0分成3種情況討論,

  • 如果它已經是最後一個元素,
  • 否則:
    • 如果它後面存在一個1,則當前位置不能放花,下一個要考慮的位置是i+=3;
    • 如果它後面元素為0,我們可以把它填上,下一個要考慮的位置i+=2;(因為當前位置是1)

每次碰到一個1時就往後跳2個元素。

class Solution {
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        int l = flowerbed.length;
        int i=0;
        while(i<l){
            if(n==0)
                return true;
            if(flowerbed[i]==1)
                i+=2;
            
            // flowerbed[i]==0
            else{
                // 如果是最後一個格子為0
                if(i==(l-1)){
                    n--; //這個格子可以種樹
                    i++;
                }
                else{
                    // 如果不是最後一個格子,則我們看看看它之後的那個格子如果不是1就可以種植
                    if(flowerbed[i+1]!=1){
                        n--;
                        i+=2; //因為當前格子為1了,所以往後跳兩個格子
                    }
                    else
                        i+=3; //因為我們下一個格子是1,所以直接跳到1右邊的第二個格子。
                }
            }

        }        
        if(n==0)
            return true;
        else
            return false;
    }
}