Leetcode【种花问题】

605. 种花问题

假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。

给你一个整数数组 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
public boolean canPlaceFlowers(int[] flowerbed, int n) {
    // 初始化计数器 x,用于记录能够种植的花的数量
    int x = 0;
    
    // 遍历花坛中的每个位置
    for (int i = 0; i < flowerbed.length; i++) {
        // 判断当前的位置是否可以种花
        // 当前的位置 i 可以种花的条件是:
        // - 如果是花坛的第一个位置,则前面没有花
        // - 如果是花坛的最后一个位置,则后面没有花
        // - 如果不是花坛的第一个位置,前面没有花
        // - 如果不是花坛的最后一个位置,后面没有花
        if ((i == 0 || flowerbed[i - 1] == 0) && flowerbed[i] == 0 && (i == flowerbed.length - 1 || flowerbed[i + 1] == 0)) {
            // 可以种花,将当前位置标记为 1
            flowerbed[i] = 1;
            // 增加计数器 x
            x++;
        }
    }
    
    // 返回是否能够种植 n 朵花
    // x 表示能够种植的花的数量,检查是否 x 等于 n
    return x >= n;
}

解题思路

  1. 初始化计数器

    • x 用来记录可以种植的花的数量。
  2. 遍历花坛

    • 遍历 flowerbed 数组中的每个位置,检查当前位置是否可以种花。
  3. 判断种花条件

    • 对于每个位置 i,判断是否满足以下条件:
      • 如果位置 i 是花坛的第一个位置(即 i == 0),则 flowerbed[i - 1] 不存在,认为前面没有花。
      • 如果位置 i 是花坛的最后一个位置(即 i == flowerbed.length - 1),则 flowerbed[i + 1] 不存在,认为后面没有花。
      • 如果位置 i 不是第一个位置,则 flowerbed[i - 1] 应为 0,表示前面没有花。
      • 如果位置 i 不是最后一个位置,则 flowerbed[i + 1] 应为 0,表示后面没有花。
    • 只有当这些条件都满足时,当前位置 i 才能种花。
  4. 更新状态

    • 在满足种花条件时,将 flowerbed[i] 设置为 1,表示当前位置已经种下了花。
    • 增加 x 计数器。
  5. 检查结果

    • 最后,返回是否能够种植 n 朵花。检查 x 是否大于或等于 n

示例

假设 flowerbed 为 [1, 0, 0, 0, 1] 和 n 为 1,执行步骤如下:

  • 步骤 1:初始化 x = 0
  • 步骤 2:遍历 flowerbed 数组:
    • 对于位置 0flowerbed[0] == 1,不满足种花条件。
    • 对于位置 1:前面为 1,不满足种花条件。
    • 对于位置 2:前后位置都为 0,满足种花条件,x 增加到 1flowerbed[2] 设置为 1
    • 对于位置 3:前后位置都为 0,满足种花条件,x 增加到 2flowerbed[3] 设置为 1
    • 对于位置 4:后面为 1,不满足种花条件。
  • 步骤 3x = 2,检查是否 x >= n。如果 n = 1,条件满足,返回 true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值