假設你有一個很長的花壇,一部分地塊種植了花,另外一部分卻沒有。但是,花卉不能種植在相鄰的地塊上,它們會爭奪水源,二者都會死去。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