leetcode605-easy-種花問題-JavaScript版

// 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))

前端算法庫:https://github.com/cunzaizhuyi/js-leetcode

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章