题目描述
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 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. 数学归纳法总结规律 ——> 转换为求连续0的问题
0-2 0
3-4 1
5-6 2
2. 注意开头和结尾满足条件可以种花
代码
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
if (flowerbed.size() == 0) return n == 0;
int cntZero = 1; //如果以0开头,假设数组前有一个零 001 cntZero = 3, 可以种一朵
int ans = 0;
for(auto i : flowerbed){
if(i == 0){
cntZero++;
}
else{
//数学归纳法
//0-2 0
//3-4 1
//5-6 2
//....
ans += (cntZero - 1) / 2;
if(ans == n)
return true;
else{
cntZero = 0;
}
}
}
//清算结尾 001100
//不用减一,默认结尾有0
ans += cntZero / 2;
return ans >= n;
}
};