示例 1:
输入:flowerbed = [1,0,0,0,1], n = 1
输出:true
示例 2:
输入:flowerbed = [1,0,0,0,1], n = 2
输出:false
思路:
鲁棒性的考虑:
如果种植的花数目是0,那么都可以,返回true;
如果数组的长度是1或者是2,种植数目是1,能不能种。
先对原数组做预处理。虽然题目说一朵花占一个位置,但由于不相邻原则,一朵花其实是占用2个位置(首尾)或3个位置(中间),所以先遍历数组,把有花位置的旁边都标记上。
因为数组首尾比较特殊,所以采取的是单独拿出来讨论的策略,对数组的遍历取的是中间位置。
接下来再次按上述规则遍历数组,这时能放花的位置还是0,不是0的地方不能放。
放花,每放一朵花就 n--,直到0为止(注意,可能出现n<0的情况,这种情况说明坑位肯定是多于花的数量的,所以到n==0就可以返回true了)
如果上面没有返回,说明坑位少,不符合要求,返回false就行了。
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
if(n==0)
return true;
if(flowerbed.size()==1 && flowerbed[0]==0 && n==1)
return true;
if(flowerbed.size()==1 && n>0)
return false;
if(flowerbed[0] == 1)
flowerbed[1]=2;
for(int i = 1; i < flowerbed.size()-1; i++)
{
if(flowerbed[i]==1)
{
flowerbed[i-1]=2;
flowerbed[i+1]=2;
}
}
if(flowerbed[flowerbed.size()-1] == 1)
flowerbed[flowerbed.size()-2]=2;
if(flowerbed[0] == 0)
{
flowerbed[1]=2;
n--;
}
for(int i = 1; i < flowerbed.size(); i++)
{
if(flowerbed[i]==0)
{
n--;
i++;
}
if(n==0)
return true;
}
return false;
}
};