【刷题打卡】605. 种花问题

137 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

一、题目描述:

605. 种花问题 - 力扣(LeetCode)

假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。

给你一个整数数组  flowerbed 表示花坛,由若干 01 组成,其中 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 * 10^4
  • flowerbed[i] 为 0 或 1
  • flowerbed 中不存在相邻的两朵花
  • 0 <= n <= flowerbed.length

二、思路分析:

思想就是对于有空白区域的地方,计算出每一个空白区域可以种植花的最大数量,局部最优解加起来称为整体最优解,基于这一点来讲,算是贪心。

空白区域可以非为三类:

  1. 10...01型,int flowermax = (n-1)/2, n为 int,中间0的个数。
  2. 0...01型或10...0型 int flowermax = (n)/2, n同上。
  3. 00...00型 int flowermax = (n+1)/2, n为 同上。

这里处理的时候统一使用第一个表达式,其他情况一次n++,n+=2.

于是,只要在循环里面通过条件语句区分出来上述的情况,便可以通过一次循环完成。

时间复杂度为O(n).

三、AC 代码:

class Solution {
public:
    bool canPlaceFlowers(vector<int>& flowerbed, int n) {
        int flowersmax = 0;
        int number = 0;
        if (flowerbed[0] == 0) number++;
        for (int i = 0; i < flowerbed.size(); ++i) {
            if ( flowerbed[i] == 0 && i < flowerbed.size() - 1 ) {
                number++;
            }
            else {
                if (i == flowerbed.size() - 1 && flowerbed[i] == 0)
                    number += 2;//不是+1
                number = (number-1)/2;//取整
                flowersmax += number;
                number = 0;
            }
        }
        if ( n <= flowersmax) return true;
        else return false;   
    }
};

范文参考:

奇技淫巧,独一无二的解法 - 种花问题 - 力扣(LeetCode)

非常简单易懂的跳格子解法(100%时间) - 种花问题 - 力扣(LeetCode)