每日一题 -- 简单 -- 种花问题(605)

71 阅读1分钟

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

给你一个整数数组  flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ****,能否在不打破种植规则的情况下种入 n ****朵花?能则返回 true ,不能则返回 false

示例 1:

输入:flowerbed = [1,0,0,0,1], n = 1
输出:true

🙇‍♂️ 感想: 这道题的题目很简单的,基本都能明白要的是什么。一开始想着是两边都有花坛的情况,而没有考虑两边没有花坛的情况

🙇‍♂️ 解题思路:这道题分两种情况,一种是左边没有花坛的情况,一种是左边有花坛的情况。 左边没有花坛的情况可以从第一个开始,左边有花坛的情况只能从第二个开始。直接看代码清晰点吧

let oneIndex = flowerbed.indexOf(1)
  if (!~oneIndex) { // 无1,每两个可以放一个, 而且奇数情况下也可以放置最后一个
    return Math.ceil(flowerbed.length / 2)  >= n
  } else { // 无有1,每两个可以放一个, 奇数情况下不可以放置最后一个
    if (oneIndex > 1) {
      n = n - Math.floor(oneIndex / 2) 
    }
    if (n <= 0) { // 花坛放完了
      return true
    }
    let zeroIndex = flowerbed.indexOf(0, oneIndex) // 从下一段0开始
    if (!~zeroIndex) return false
    let count: number = 0
    for (let i = zeroIndex; i < flowerbed.length; i++) {
      if (flowerbed[i] === 0) {
        count++
        if (count === 3) {
          n--
          count = count - 2
          if (!n) return true
        }
      } else if (count) {
        count = 0
      }
    }
    if (count >= 2 && n) {
      n--
    }
    return n === 0
  }

也可以使用快慢指针的方式。慢指针指向每一段空花坛中第一块空地,快指针指向最后一块空地,计算两者间可以存放多少花坛