有两个很重要的规律:
1.如果0的连续个数n>2,那么这个地方就能种(n-1)/2朵花——这个规律最起码需要想一会,但是当时我已经想了一个很笨的方法半天了,我已经告诉我自己:我没有什么办法了——想的时间不够多,但是我给我做题的时间就是这么一会,时间到了就开始翻答案了,下次要再想想别的方法——每次都是想一个办法想很久之后就不再考虑别的方法了!!!——脑袋太懒了!!!
2.由于花不和边界抢水,所以我们可以在数组头尾设置0,表示边界
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int a=0,c;
//这里多设置了两个循环,用来给首尾元素加0用
for(int i=0;i<flowerbed.size()+2;i++)
{
//这是第一个元素加0的地方,也是最后一个元素加0的地方
c=0;
//由于多加了前后两个元素,所以计数方式有变化了
//所以这里是从flowerbed[0]到flowerbed[len-1],正好遍历了整个数组
if(i>0 && i<flowerbed.size()+1)
{
c=flowerbed[i-1];
}
if(c==0)
++a;
if(c==1)
{
if(a>2)
{
n-=(a-1)/2;
}
a=0;
}
}
if(a>2){
n-=(a-1)/2;
}
if(n<=0)
return true;
return false;
}
};