605. 种花问题

文章讲述了如何在满足花坛种植规则(花不能相邻)的情况下,判断给定整数数组中最多能种植多少花。提供了三种不同的求解方法,包括暴力遍历、优化判断条件以及针对特定模式的0求解法。
摘要由CSDN通过智能技术生成

链接
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给你一个整数数组 flowerbed 表示花坛,由若干 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 <= flowerbed.length <= 2 * 104
flowerbed[i] 为 0 或 1
flowerbed 中不存在相邻的两朵花
0 <= n <= flowerbed.length

1.暴力求解

从数组的首个元素开始判断是否种花,判断当前位置的前后位置是否种花,要注意数组越界问题和首地址和尾地址位置问题。

bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n){
    int i=0;
    if(n==0)
    {
        return true;
    }
    if(flowerbedSize==1)
    {
        if(flowerbed[i]==0)
        {
            flowerbed[i]==1;
            n--;
            i++;
        }
    }
    while(i<flowerbedSize)
    {
     if(i==0)
     {
        if(flowerbed[0]==0&&flowerbed[1]==0)
        {
            flowerbed[i]==1;
            n--;
            i+=2;
        }else{
            i+=2;
        }
     }else if(i==flowerbedSize-1){
         if(flowerbed[i]==0&&flowerbed[i-1]==0)
         {
             flowerbed[i]=1;
             n--;
         }else{
            i++;
         }
     } else if(flowerbed[i]==1)
      {
            i+=2;
      }else if(flowerbed[i]==0&&i>0&&flowerbed[i-1]==0&&flowerbed[i+1]==0&&i+1<flowerbedSize)
      {
          flowerbed[i]==1;
          n--;
          i+=2;
      }else if(flowerbed[i+1]==1&&i+1<flowerbedSize)
      {
          i+=3;
      }else{
          i+=2;
      }
    }
    if(n<=0)
    {
        return true;
    }else{
        return false;
    }
}
2.暴力优化

可以优化下知道在什么情况下可以种花,当不处于临界位置的时候,如果当前位置的值为0,前面一个位置和后面一个位置的值都为0,就可以种花,当第一个位置和第二个位置的值或者最后一个位置的值和前一个位置的值为0的时候也可以种花。要注意数组越界的问题。

bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n){                                                
    for(int i=0;i<flowerbedSize;i++)
    {
        // printf("i=%d\n",i);
        if(flowerbed[i]==0&&(i==0||flowerbed[i-1]==0)&&(((i+1<flowerbedSize)&&(flowerbed[i+1]==0))||i==flowerbedSize-1))
        {
            flowerbed[i]=1;
            n--;
        }
    }
    return n<=0;
}

0求解法

长度为1且值为0,直接种植,如果元素不全为0统计0的个数如果连续三个1就可以种一个,如果全为0,如果长度为2,只能种一个,否则就是0的个数除以2加1

bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n){                                                
  int count=0,i,sum=0,flage=0;
  if(flowerbedSize==1)
  {
      if(flowerbed[0]==0)
      {
          return true;
      }
  }
  if(flowerbed[0]==0)
  {
      count++;
  }
  for(i=0;i<flowerbedSize;i++)
  {
      if(flowerbed[i]==0)
      {
          count++;
      }else if(count>=2){
            flage=1;
            sum+=(count-1)/2;
            count=0;
      }else if(count<2){
          count=0;
           flage=1;
      }
  }
  if(count>=2)
  {
      if(flage==0)
      {
          if(count==2)
          {
            sum-=1;
          }else{
               sum+=count/2;
          }
      }else{
          if(count==2)
          {
             sum+=1;
          }else{
              if(count%2==0)
              {
                sum+=count/2;
              }else{
                sum+=(count-1)/2;
              }
          }
      }
  }
  if(sum>=n)
  {
      return true;
  }
  else{
      return false;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值