2021-01-01 605

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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44495738/article/details/112062827