持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
一、题目描述:
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 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 * 10^4
- flowerbed[i] 为 0 或 1
- flowerbed 中不存在相邻的两朵花
- 0 <= n <= flowerbed.length
二、思路分析:
思想就是对于有空白区域的地方,计算出每一个空白区域可以种植花的最大数量,局部最优解加起来称为整体最优解,基于这一点来讲,算是贪心。
空白区域可以非为三类:
- 10...01型,int flowermax = (n-1)/2, n为 int,中间0的个数。
- 0...01型或10...0型 int flowermax = (n)/2, n同上。
- 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;
}
};