假设你有一个很长的花坛,一部分地块种植了花,另外一部分却没有。但是,花卉不能种植在相邻的地块上,它们会争夺水源,二者都会死去。git
给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。可否在不打破种植规则的状况下种入 n 朵花?能则返回True,不能则返回False。github
示例 1:web
示例 2:算法
个人思路
连续空地数 可种花的最值 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或者更多数据结构的内容,能够戳这里,欢迎starpost