题目: 假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 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
}
也可以使用快慢指针的方式。慢指针指向每一段空花坛中第一块空地,快指针指向最后一块空地,计算两者间可以存放多少花坛