数据结构与算法之数组: LeetCode 605. 种花问题 (Typescript版)

种花问题

  • https://leetcode.cn/problems/can-place-flowers/

描述

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

  • 给你一个整数数组 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 * 1 0 4 10^4 104
  • flowerbed[i] 为 0 或 1
  • flowerbed 中不存在相邻的两朵花
  • 0 <= n <= flowerbed.length

算法实现
1 )方案 1

function canPlaceFlowers(flowerbed: number[], n: number): boolean {
    // 计数
    let count = 0
    // 在这里对数组进行扩展来方便编程,最后一块地能不能种只取决于前面的是不是1,所以默认最后一块地的右侧是0
    flowerbed.push(0)
    for (let i = 0, len = flowerbed.length - 1; i < len; i++) {
        // 当前是非零的情况,直接跳过
        if (flowerbed[i] !== 0) {
            continue
        }
        // 开始边界的处理
        if (i === 0 && flowerbed[1] === 0) {
            count++
            i++
        } else if (flowerbed[i - 1] === 0 && flowerbed[i + 1] === 0) {
            // 这种情况是正常情况,当前左右都是0,则可种树
            count++
            i++
        }
        // 结束边界无需处理,因为数组在最后扩展了一个0,上述正常情况已经包含了 无 
    }
    return count >= n
}
  • 这里需要一个数学建模,哪些情况下可以种花,简化模型
  • 这里的地就是指 1或0,1是一块地,0也是一块地
  • 我们需要放1,能放1的地方是左边和右边都是0,并且当前位置是0
  • 匹配完成后,我们要主动跳过当前匹配,也就是跳2个位置
    • 体现在手动 i++以及for循环一次后自带的一个i++

你可能感兴趣的:(Data,Structure,and,Algorithms,Typescript,leetcode,算法,typescript)