leetcode刷题937-8 | 605 Can Place Flowers

leetcode刷题937-8 | 605 Can Place Flowers

问题描述: 假设你有一个很长的花坛,里面有些是种的,有些不是。然而,鲜花不能种植在相邻的地块上——它们会争夺水源,最终都将死去。给定一个花坛(表示为包含0和1的数组,其中0表示空,1表示不空)和一个数字n,如果可以在其中种植n朵新花而不违反无邻接花规则,则返回true。

示例1: 输入:flowerbed=[1,0,0,0,1],n=1 输出:true 示例2: 输入:flowerbed=[1,0,0,0,1],n=2 输出:false

解题思路:这题需要考虑许多特殊情况,我的做法是找到这些特殊情况,然后一一解决,事实证明是行的通的,当然,还有一种方法,就是将特殊情况正常化(自己的理解),然后统一按照正常方法解决。

具体方法(因人而异):下面我介绍两种方法: 1.统计数组中被1隔开的0的长度,根据公式判断可以变成多少个1,当然,全部的情况都要考虑(以0开头或以0结尾的数组,全为0的数组,开头为1和结尾为1的情况) 2.若开头两位或结尾两位存在0,则将其做特殊处理,将开头的0变为1,计数器加1,将结尾的0变为1,计数器在加1;其他元素通过遍历,若出现某个元素为0,且其前后都为0,则将该原属变为1,计数器在加1。

我的思路:时间8ms(对应思路1)

bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n) {
   //flag用于判断该数组是否是全0数组,sum用于统计被分割的0的数目,fujia用于统计是否存在以0后以0结尾,count1用于统计最多可以摘多少树,count用于统计被分割的0的长度。
     int i,j=0,count=0,count1=0,fujia=0,sum=0,flag=0; 
        //求出被1分割的0的个数sum
    for(i=0;i<flowerbedSize;i++){
        if(flowerbed[i]==0){
          count++;
        }
        else{
          flag=1;
        }
        if((count!=0&&flowerbed[i]==1)||(i==flowerbedSize-1&&flowerbed[i]==0)&&flag==1){
            sum++;
            count=0;
        }
    }
        //计算count1
    for(i=0;i<flowerbedSize;i++){
​
```
    if(flowerbed[i]==0){//统计0的长度
       count++;
    }
    if((count!=0&&flowerbed[i]==1)||(i==flowerbedSize-1&&flowerbed[i]==0&&flag==1)){//当数组元素不全为0时
        
        count1=count1+(count+1)/2-1;
        j++;        
        if(j==1&&count%2==0&&flowerbed[0]==0)
            fujia++;
        if(j==sum&&count%2==0&&flowerbed[flowerbedSize-1]==0)
            fujia++;
        count=0;
    }
    else if(flag==0){//当数组元素全为0的情况
        count1=count1+(count+1)/2-1;
        j++;        
        if(j==1&&count%2==0&&flowerbed[0]==0)
            fujia++;
        count=0;
    }
    
}
​
if(n<=count1+fujia){
    return true;
}
return false;
```
​
}

其他人的思路,4ms(对应思路2)

​
bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n) {
    int i,count=0;
    if(flowerbed[0]==0&&flowerbed[1]==0)
    {
        count++;
        flowerbed[0]=1;
    }
    if(flowerbed[flowerbedSize-1]==0&&flowerbed[flowerbedSize-2]==0)
    {
        count++;
        flowerbed[flowerbedSize-1]=1;
    }
    
​
```
for(i=1;i<flowerbedSize-1;i++)
{
    if(flowerbed[i]==0&&flowerbed[i+1]==0&&flowerbed[i-1]==0)
    {
        count++;
        flowerbed[i]=1;
    }
}
if(count>=n)
return true;
return false;
```
​
}

猜你喜欢

转载自blog.csdn.net/dingkm666/article/details/84558116