605. 種花問題

小橋落花流水發表於2021-01-01

605. 種花問題

假設你有一個很長的花壇,一部分地塊種植了花,另一部分卻沒有。可是,花卉不能種植在相鄰的地塊上,它們會爭奪水源,兩者都會死去。給定一個花壇(表示為一個陣列包含0和1,其中0表示沒種植花,1表示種植了花),和一個數 n 。能否在不打破種植規則的情況下種入 n 朵花?能則返回True,不能則返False。

示例 1:

輸入: flowerbed = [1,0,0,0,1], n = 1
輸出: True


示例 2:

輸入: flowerbed = [1,0,0,0,1], n = 2
輸出: False


注意:

陣列內已種好的花不會違反種植規則。
輸入的陣列長度範圍為 [1, 20000]。
n 是非負整數,且不會超過輸入陣列的大小。


基本思路:貪心演算法,儘可能多的插花,那麼在兩個已經種花[i,j]區間之間,其中,i,j已經可以種花,其他都是沒有種花,最多可以種多少花?

  • 真正可以種花的區間是[i+2,j-2],有效區間長度為區間長度len=j-i-3,最多可以種(len+1)/2個花
  • 對於起點[0,i],在i位置上種花,有效區間長度[0,i-2],其長度為len=i-1,最多可以種(len+1)/2個花
  • 對於終點[j,size-1],在j位置上種花,有效區間長度為[j+2,size-1],其長度len=flowerbed.size()-j-2,最多可以種(len+1)/2個花
    bool canPlaceFlowers(vector<int>& flowerbed, int n) {
        int cnt=0;
        int pre=-1;
        for(int i=0;i<flowerbed.size();i++){
            if(flowerbed[i]==1){
                if(pre<0){
                    cnt+=i/2;
                }
                else{
                    cnt+=(i-pre-2)/2;
                }
                pre=i;
            }
            if(cnt>=n)
                return true;
        }

        if(pre<0){
            cnt=(flowerbed.size()+1)/2;
        }
        else if(flowerbed.size()>pre+1){
            cnt+=(flowerbed.size()-1-pre)/2;
        }
        return cnt>=n;
    }

基本思路:思考那種情況可以種花

  • 0|0|0,即當前節點的左右都為空
  • 左邊界|0|0,即當前節點為0
  • 0|0|右邊界,即當前節點為flowerbed.size()-1;
    bool canPlaceFlowers(vector<int>& flowerbed, int n) {
        int i=0;
        while(i<flowerbed.size()&&n>0){
            if(flowerbed[i]==1){
                i+=2;
            }
            else if(flowerbed[i]==0&&(i==0||flowerbed[i-1]==0)&&(i==flowerbed.size()-1||flowerbed[i+1]==0)){
                n--;
                i+=2;

            }
            else    
                i+=3;
        }
        return n<=0;
    }

基本思路:對上述方法的改進,當前為1或者可以種花的情況下,直接跳到i+2,因為i+1必然為零,否則的話,直接跳到i+3,因為下一個必然為1.

    bool canPlaceFlowers(vector<int>& flowerbed, int n) {
        int i=0;
        while(i<flowerbed.size()&&n>0){
            if(flowerbed[i]==1){
                i+=2;
            }
            else if(i==flowerbed.size()-1||flowerbed[i+1]==0){
                n--;
                i+=2;

            }
            else    
                i+=3;
        }
        return n<=0;
    }

 

相關文章