// 605 easy 種花問題
// 跟849題一樣
// 假設你有一個很長的花壇,一部分地塊種植了花,另一部分卻沒有。可是,花卉不能種植在相鄰的地塊上,它們會爭奪水源,兩者都會死去。
//
// 給定一個花壇(表示爲一個數組包含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 是非負整數,且不會超過輸入數組的大小。
/**
* 思路:區分邊界和非邊界兩種情況。
* 邊界:0個0,1個0,可種花0; 兩個0,3個0, 可種花1朵,以此類推。。。 0的個數 / 2 向下取整 是 邊界可種花數
* 非邊界:1,2個0,可種0朵花;3,4個0,可種1朵花,以此類推,n個0可種 Math.ceil(n / 2) - 1
* 總可種花數是邊界加非邊界可種數,然後跟n比較
* @param {number[]} flowerbed
* @param {number} n
* @return {boolean}
*/
var canPlaceFlowers = function(flowerbed, n) {
let leftZeroNumber = flowerbed.indexOf(1)
// case中 根本沒有1的情況。。。哭了
if (leftZeroNumber === -1){
return Math.ceil(flowerbed.length / 2) >= n
}
let rightZeroNumber = flowerbed.length - flowerbed.lastIndexOf(1) - 1
// 邊界可種花數
let borderNumber = Math.floor(leftZeroNumber / 2) + Math.floor(rightZeroNumber / 2);
let innerNumber = 0
let index = leftZeroNumber
let l;
while(index <= flowerbed.lastIndexOf(1)){
if (flowerbed[index] === 1){
if (l === undefined) {
l = index;
}else{
let zeroNumber = index - l - 1;
innerNumber += Math.ceil(zeroNumber / 2) - 1
l = index;
}
index++;
} else {
index++
}
}
return borderNumber + innerNumber >= n
};
console.log(canPlaceFlowers([1], 0))
leetcode605-easy-種花問題-JavaScript版
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.