题目来源于力扣(LeetCode)
一、题目
题目相关标签:数组
提示:
- 数组内已种好的花不会违反种植规则。
- 输入的数组长度范围为 [1, 20000]。
- n 是非负整数,且不会超过输入数组的大小。
二、解题思路
-
通过计算 flowerbed 数组中连续的 0 的个数,来判断能够种几朵花
-
注意点:如果数组的起始索引为 0 或结束索引为 0 的情况下,并且连续 0 的个数大于等于 2 时,便可以最少种 1 朵花,大于等于 4 时,可以最少种 2 朵花
-
据题意:数组=内已种好的花不会违反种植规则。即表明初始的 flowerbed 数组中不会存在相邻的两个元素,值都为 1
-
除数组的起始和结束的连续 0 外,其他位置的连续 0 的个数,个数需要满足 2 * i + 1 的式子才能种 i 朵花
三、代码实现
public static boolean canPlaceFlowers(int[] flowerbed, int n) {
// 变量 count 记录连续 0 的数量,为方便后续计算,令初始时计零的个数为 1
// {0, 0, 1} 此时 0 的个数为 2,却因为在开头,所以也可以种 1 朵花
int count = 1;
// 记录能够种花的数量
int num = 0;
for (int i = 0; i < flowerbed.length; i ++) {
if (flowerbed[i] == 0) {
// 连续出现 0 的次数加 1
count++;
} else {
// 1 或 2 次可以种 0 朵,3 次可以种 1 朵,5 次可以种 2 朵
num += (count - 1) / 2;
// 满足种花的数量后,返回 true
if (num >= n) {
return true;
}
// count 重置为 0,最少需要 3 个连续的 0 才能种 1 朵花
count = 0;
}
}
// 处理最后的零的个数,两个零也可以种 1 朵,4 个零种 2 朵,3 个零种 1 朵,5 个零种 2 朵
// {1, 0, 0},此时,两个 0 也可以种 1 朵花
if (count > 0) {
num += count / 2;
}
return num >= n;
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
int[] flowerbed = {1, 0, 0, 0, 1};
int n = 1; // output:true
// int[] flowerbed = {1, 0, 0, 0, 1};
// int n = 2; // output:false
boolean result = canPlaceFlowers(flowerbed, n);
System.out.println(result);
}