题干:
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。
示例:
输入:flowerbed = [1,0,0,0,1], n = 1 输出:true
public class 种花问题 {
public static void main(String[] args) {
int[] flowerbed = {1,0,0,0,1};
int n = 1;
System.out.println(canPlaceFlowers(flowerbed,n));
}
public static boolean canPlaceFlowers(int[] flowerbed, int n) {
int len = flowerbed.length;
int k=0;
for(int i=0;i<len&&k<=n;i++)
{
if(flowerbed[i]==1) continue;
int pre = i==0? 0:flowerbed[i-1];
int next = i==len-1? 0:flowerbed[i+1];
if(pre==0&&next==0)
{
++k;
flowerbed[i]=1;
}
}
return k>=n;
}
}
这题主要是分情况讨论:
1.数组开头为0,且开头后一个数也为0。
2.数组中间某位置为0,前面为0,后面也为0。
3.数组结尾为0,且结尾前一个数也为0。
4.数组仅一个数且为0(此时走的是pre=0,next=0)
满足以上四种情况之一,就可以种花。另外,通过在for循环中设置k<=n以及在for循环体中设置if(flowerbed[i]==1) countinue;可提升程序执行用时以及内存消耗。