题目:
假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花?能则返回True,不能则返回False。
示例:
输入: flowerbed = [1,0,0,0,1], n = 1
输出: True
输入: flowerbed = [1,0,0,0,1], n = 2
输出: False
class Solution {
public:
/*
思路:
1.当两个已经种植的花之间 的空闲位置N 为大于 3
的数字时,如果是奇数则除以2,
如果是偶数则除以2然后减1,整理一下也就等于(N-1)/2;
2.对于边界,当开头两个未种植且第三个种植时,
则需要加1,对结尾最后两个未种植
且最后第三个种植时,也加1;
3.整理一下,可以给种花的数组前后都加一个0,这样就
能直接遍历一次出结果;
需要注意:当花坛最后不为1时,计算的zeroNum的数量
在遍历过程中 不会在被减掉,需要重新判断。
*/
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int arrlen = flowerbed.size();
int result = n;
//zeroNum初始化为1表示已经在最前端加了一个0
int zeroNum = 1;
for(int i=0;i<arrlen;i++)
{
if(flowerbed[i]==0)
zeroNum++;
else if(flowerbed[i]==1)
{
if(zeroNum>=3)
{
result = result-(zeroNum-1)/2;
}
zeroNum = 0;
}
}
//zeroNum用2是由于最后一位加0没有体现
if(zeroNum>=2)
{
//该位置使用zeroNum也是由于没有加最后一位 0
result = result-zeroNum/2;
}
if(result <=0)
return true;
else
return false;
}
};