Featured image of post Can Place Flowers

Can Place Flowers

605. 种花问题

分析

  1. 寻找连续空地:
    • 遍历数组时,如果遇到值为 0 的位置,开始寻找连续空地的终点
    • 空地的长度是终点索引减去起点索引
  2. 边界特殊处理:
    • 如果空地段位于数组的开头或结尾,由于没有相邻的种植限制,可以额外种植一朵花
  3. 更新累积种植数量:
    • 根据空地长度计算可种植的花数,并累积到 res
    • 如果 res 已达到或超过目标值 n,提前返回 true,减少不必要的计算

时间复杂度

总时间复杂度 O(n)

空间复杂度

空间复杂度为 O(1)

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
public:
    bool canPlaceFlowers(vector<int>& flowerbed, int n)
    {
        if (!n) return true; // 如果需要种植的花为 0,直接返回 true。
        int res = 0; // 已种植的花数。

        for (int i = 0; i < flowerbed.size(); ++i)
        {
            if (flowerbed[i]) // 当前位置已经种植了花,跳过。
                continue;

            int j = i;
            // 找到连续空地的终点。
            while (j < flowerbed.size() && flowerbed[j] == 0)
                ++j;

            // 计算连续空地的长度。
            int k = j - i - 1;

            // 边界处理:如果在开头或结尾,空地长度增加 1。
            if (!i)
                k += 1;
            if (j == flowerbed.size())
                k += 1;

            // 根据种植规则计算可以种植的花数。
            res += k / 2;

            // 如果累计种植的花数已达到或超过 n,返回 true。
            if (res >= n)
                return true;

            // 跳过当前检查的空地段。
            i = j;
        }

        // 如果遍历结束仍未满足 n,返回 false。
        return false;
    }
};
Built with Hugo
Theme Stack designed by Jimmy