LeetCode 605. 種花問題(簡單模擬)——每日一題
上一篇部落格:LeetCode 53. 最大子序和
寫在前面:大家好!我是
AC-fun
,我的暱稱來自兩個單詞Accepted
和fun
。我是一個熱愛ACM的蒟蒻。最近萌生了刷LeetCode的想法,所以我打算從LeetCode簡單的題目開始做起,攻陷LeetCode。如果部落格中有不足或者的錯誤的地方歡迎在評論區或者私信我指正,感謝大家的不吝賜教。我的唯一部落格更新地址是:https://ac-fun.blog.csdn.net/。非常感謝大家的支援。一起加油,衝鴨!
用知識改變命運,用知識成就未來!加油 (ง •̀o•́)ง (ง •̀o•́)ง
原題連結:LeetCode 605. 種花問題
文章目錄
題目資訊
題目描述
假設你有一個很長的花壇,一部分地塊種植了花,另一部分卻沒有。可是,花卉不能種植在相鄰的地塊上,它們會爭奪水源,兩者都會死去。
給定一個花壇(表示為一個數組包含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 是非負整數,且不會超過輸入陣列的大小。
題解
解題思路
首先我們要判斷只有一個花盆的情況,因為在下方的注意中說明了 n 是非負整數,且不會超過輸入陣列的大小。所以先判斷陣列只有一位(即只有一個花盆)的情況下是否滿足條件,如果花盆中沒有種花,那麼直接返回 true
即可(因為n最大為1
,所以可以直接返回 true
)。
然後判斷兩個及以上花盆的情況,主要的思路是使用一個計數器 cnt
來統計最多可以種多少朵花,如果最後 cnt >= n
那麼說明可以種的下:首先判斷第一個和最後一個花盆是否滿足條件,如果滿足則從第三個花盆開始判斷,每一次判斷其前後以及當前的位置是否都沒有種花,如果都沒有,則cnt++
1
,表示種上了花,然後繼續進行統計,直到統計到倒數第二個。
解題程式碼
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int cnt = 0;
int len = flowerbed.size();
if (len == 1 && flowerbed[0] == 0) return true;
if (flowerbed[0] == 0 && flowerbed[1] == 0) {
cnt++;
flowerbed[0] = 1;
}
if (flowerbed[len - 1] == 0 && flowerbed[len - 2] == 0) {
cnt++;
flowerbed[len - 1] = 1;
}
for (int i = 2; i < flowerbed.size() - 1; i++) {
if (flowerbed[i - 1] == 0 && flowerbed[i + 1] == 0 && flowerbed[i] != 1) {
cnt++;
flowerbed[i] = 1;
}
}
if (cnt >= n) return true;
return false;
}
};
優化思路
先在陣列第一位之前和最後一位之後加上一個 0
,然後就可以直接判斷,而不需要特判是否只有一個花盆以及第一個和最後一個花盆是否滿足條件了。
優化解題程式碼
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int cnt = 0;
flowerbed.insert(flowerbed.begin(), 0);
flowerbed.insert(flowerbed.end(), 0);
int len = flowerbed.size();
for (int i = 1; i < len - 1; i++) {
if (flowerbed[i - 1] == 0 && flowerbed[i + 1] == 0 && flowerbed[i] != 1) {
cnt++;
flowerbed[i] = 1;
}
}
if (cnt >= n) return true;
return false;
}
};
未完待續,持續更新中……