avatar

LeetCode-605 种花问题

📝题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。

给你一个整数数组  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*10^4
flowerbed[i] 为 0 或 1
flowerbed 中不存在相邻的两朵花
0 <= n <= flowerbed.length


📝思路

方法一:跳跃两格判断。根据当前花坛的值,如果:

  • 无种花
    • 且下一花坛也无种花,或当前花坛为最后一个花坛,则当前可种花;可种花意味着下一花坛不可用,因此向前跳两格。
    • 且下一花坛已种花,则当前不可种花;下一花坛已种花意味着下下一花坛也不可用,因此向前跳三格。
  • 有种花,直接向前跳两格。

方法二:在原数组两端补零,此时就不需要考虑边界了√

📝题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//方法一
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
if (!n) return true;
int len = flowerbed.size();
if (len < n) return false;

int cnt = 0;
for (int i = 0; i < len; i += 2) {
if (!flowerbed[i]) {
if (i == len-1 || !flowerbed[i+1]) cnt++;
else i++;
}
}
return cnt >= n;
}
Author:WhiteBeerHouse
Link:https://github.com/WhiteBeerHouse/WhiteBeerHouse.github.io/tree/master/2021/02/06/LeetCode-605-%E7%A7%8D%E8%8A%B1%E9%97%AE%E9%A2%98/
Copyright Notice:All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.