1. 程式人生 > 其它 >LeetCode刷題筆記 605.種花問題

LeetCode刷題筆記 605.種花問題

假設有一個很長的花壇,一部分地塊種植了花,另一部分卻沒有。可是,花不能種植在相鄰的地塊上,它們會爭奪水源,兩者都會死去。

給你一個整數陣列flowerbed 表示花壇,由若干 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 <= flowerbed.length <= 2 * 104
flowerbed[i] 為 0 或 1
flowerbed 中不存在相鄰的兩朵花
0 <= n <= flowerbed.length

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/can-place-flowers

分析:

【1】當遍歷到flowerbed[i]==1時,說明這個位置有花,那必然從i+2的位置才有可能種花,因此當碰到1時直接跳過下一格。

【2】當遍歷到flowerbed[i]== 0時,由於每次碰到1都是跳兩格,因此前一格必定是0,此時只需要判斷下一格是不是1即可得出i這一格能不能種花,如果能種則令n減一,然後這個位置就按照遇到1時處理,即跳兩格;如果 i 的後一格是1,說明這個位置不能種花且之後兩格也不可能種花(參照【1】),直接跳過3格。

當n減為0時,說明可以種入n朵花,則可以直接退出遍歷返回true;如果遍歷結束n沒有減到0,說明最多種入的花的數量小於n,則返回false。

class Solution {
public:
    bool canPlaceFlowers(vector<int>& flowerbed, int n) {
        for ( int i = 0, size = flowerbed.size(); i < size && n > 0; ) {
            if ( flowerbed[i] == 1 )    i += 2;
            else if ( i == size - 1 || flowerbed[i + 1] == 0) {
                n
--; i += 2; } else { i += 3; } } return n <= 0; } };