605. 种花问题『简单』

题目来源于力扣(LeetCode

一、题目

605. 种花问题

题目相关标签:数组

提示:

  1. 数组内已种好的花不会违反种植规则。
  2. 输入的数组长度范围为 [1, 20000]。
  3. n 是非负整数,且不会超过输入数组的大小。

二、解题思路

  1. 通过计算 flowerbed 数组中连续的 0 的个数,来判断能够种几朵花

  2. 注意点:如果数组的起始索引为 0 或结束索引为 0 的情况下,并且连续 0 的个数大于等于 2 时,便可以最少种 1 朵花,大于等于 4 时,可以最少种 2 朵花

  3. 据题意:数组=内已种好的花不会违反种植规则。即表明初始的 flowerbed 数组中不会存在相邻的两个元素,值都为 1

  4. 除数组的起始和结束的连续 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);
}
posted @ 2020-05-23 21:00  知音12138  阅读(184)  评论(0编辑  收藏  举报