- 种花问题
题目
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 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
错误代码
bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n){
int i;
for(i=0;i<flowerbedSize && n>0;i++)
{
if(flowerbed[i]==0&&
(i==0 || (flowerbed[i-1]==0 && i-1 >= 0) ) &&
((flowerbed[i+1]==0 && i+1<flowerbedSize) || i==flowerbedSize-1)
)
{
flowerbed[i]=1;
n--;
}
}
return n==0;
}
官方正解
bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n) {
int count = 0;
int prev = -1;
for (int i = 0; i < flowerbedSize; i++) {
if (flowerbed[i] == 1) {
if (prev < 0) {
count += i / 2;
} else {
count += (i - prev - 2) / 2;
}
if (count >= n) {
return true;
}
prev = i;
}
}
if (prev < 0) {
count += (flowerbedSize + 1) / 2;
} else {
count += (flowerbedSize - prev - 1) / 2;
}
return count >= n;
}
最优解
bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n){
for(int i=0; i < flowerbedSize && n > 0; ++i){ //遍历数组,遍历完或花都种完则结束
if(flowerbed[i] == 0 && (i == 0 || flowerbed[i-1] == 0) && (i == flowerbedSize-1 || flowerbed[i+1] == 0)){ //满足种花条件
flowerbed[i] = 1; //种花
--n; //花数减一
}
}
return n == 0; //花全部种完
}
笨办法
bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n){
int i;
if(n==0)
return true;
if(flowerbedSize==0)
{
return false;
}
if(flowerbedSize==1)
{
if(flowerbed[0]==0)
return true;
else return false;
}
if(flowerbed[0]==0 && flowerbed[1]==0)
{
n--;
flowerbed[0]=1;
}
if(flowerbed[flowerbedSize-1]==0 && flowerbed[flowerbedSize-2]==0)
{
n--;
flowerbed[flowerbedSize-1]=1;
}
for(i=1;i<flowerbedSize-1 && n>0;i++)
{
if(flowerbed[i]+ flowerbed[i-1] + flowerbed[i+1]==0
)
{
flowerbed[i] = 1;
n--;
}
}
return n<=0;
}