LeetCode 605. 莳花题目
假定你有一个很长的花坛,一部份地块莳植了花,另一部份却没有。然则,花草不能莳植在相邻的地块上,它们会争取水源,二者都邑死去。
给定一个花坛(示意为一个数组包括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, 20000]。
n 黑白负整数,且不会凌驾输入数组的大小。
我的思绪
总的来说,这道题在leetCode 中不算难的,症结就是要有思绪。下面是我本身做题时的剖析。
1. 在双方都是花 中心都是旷地的状况下(症结前提) ,算出可以莳花的最值。如[1,0,0,0,0,1]=>1
一连旷地数 可莳花的最值
0 => 0
1 => 0
2 => 0
3 => 1
4 => 1
5 => 2
6 => 2
7 => 3
有觉得的老哥 ,预计已经有了主意,没错就是
parseInt((n - 1) / 2 ) = 可以种几颗 // (n为近来两个花 之间的旷地数目)
得出了这个结论 就基本完成了 然则另有2种特殊状况,以下是完全代码(打败84%的js提交)
let canPlaceFlowers = (flowerbed, n) => {
let filedBegin = flowerbed[0] > 0 ? true : false;
let filedEnd = flowerbed[flowerbed.length - 1] > 0 ? true : false;
if (!filedBegin) {
flowerbed.unshift(1, 0)
}
if (!filedEnd) {
flowerbed.push(0, 1)
}
//上面步骤的缘由
// 碰到这两种状况[0, 0, 1, 0, 0] 或许[0]
// 根据parseInt((n - 1) / 2) 划定规矩得出的都是零 由于这类算法 是以 双方都是花的状况下的效果
// 而上面这两种 0的两面 或许有一面 是没有花的 所以手动 给他们加上
// [0, 0, 1, 0, 0]=> [1, 0, 0, 1, 0, 0, 0, 1]
// [0]=> [1, 0, 0, 0, 1]
// 如许就相符我们的划定规矩了
let size = 0 //近来两个花 之间的旷地数目
let canfiled = 0 //可以莳植的数目
for (let i = 1, len = flowerbed.length; i < len; i++) {
if (flowerbed[i] > 0) {//
if (size == 0) continue //申明 处在 1 1 相邻的状况 直接跳过
let num = parseInt((size - 1) / 2) // 当前距离最多可以莳植的数目
canfiled += num
size = 0 //重置距离数目
} else {//当前是旷地 旷地数目+1
size++
}
}
return canfiled >= n
};
2.最快的类型
这类思绪是以每一个轮回的元素为中心 当 当前旷地元素的前一个元素和后一个元素为旷地 那末代表着可以莳植,(固然 依旧要考虑到目的数组的头尾为旷地0的状况) 而且直接转变原数组 flowerbed[j] = 1 ->这是他逻辑中一语道破的步骤
var canPlaceFlowers = function (flowerbed, n) {
// 定义一个sum = 0
// 遍历花坛,找到如许一个位置,此位置空,&& 前后都为空,则sum+1
// 推断sum与n大小比较
[0, 1, 0]
if (!n) return true;
var sum = 0
var length = flowerbed.length
for (var j = 0; j < length; j++) {
if (!flowerbed[j]) {//当前是 旷地
//关于右边的限定前提 true 示意可以莳植(仅关于左边来说)
var leftVoid = j === 0 || flowerbed[j - 1] === 0
//关于右边的限定前提 true 示意可以莳植(仅关于右边来说)
var rightVoid = j === length - 1 || flowerbed[j + 1] === 0
if (leftVoid && rightVoid) {
// 可以莳植
flowerbed[j] = 1 //直接将改位置 种上花 让背面的推断顺利进行 比较症结
sum++
if (sum === n) { //轮回次数 能够少些 由于 sum的最大值是大于即是n 才满足
return true
}
}
}
}
return false
}
假如喜好LeetCode或许更多数据结构的内容,可以戳这里,迎接star