示例 1:git
示例 2:github
個人思路web
連續空地數 可種花的最值
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.最快的範例bash
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數據結構