题目描述
自己解法
由题目可知,可栽种花的个数与数组中前后相邻的零
的个数有关,有两种情况:
- 0位于数组边界
- 0不位于数组边界
考虑第一种情况,例如,连续3、4个零存在,则中间可栽种一朵花:
[1,0,0,0,1]
[1,0,0,0,0,1]
##1朵花
连续5、6个零存在,则中间可种2朵花,以此类推,构成一定的映射关系。
[1,0,0,0,0,0,1]
[1,0,0,0,0,0,0,1]
##2朵花
考虑第二种情况,当0位于数组边界时,映射关系与第一种情况不同:
[0,0,1] ##1朵花
[0,0,0,1] ##1朵花
[0,0,0,0,1] ##2朵花
为达成统一,在数组前后各添一个零
,这样两种情况的映射关系达成统一:
##填充前
[1,0,0,0,1]
##填充后
[0,1,0,0,0,1,0]
0的个数与可栽种花的数量映射关系如下表(零的个数至少为1):
零的个数 | 花的数量 |
---|---|
1 | 0 |
2 | 0 |
3 | 1 |
4 | 1 |
5 | 2 |
6 | 2 |
7 | 3 |
8 | 3 |
由此可知当零的个数为奇数
时,花朵数为int(零的个数/2)
,当零给个数为偶数
时,花朵数为零的个数/2 -1
,用滑动窗口法统计零的个数即可。
class Solution:
def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
flowerbed = [0] + flowerbed + [0]
ans = 0
p,q = 0,1
zero_count = 0
length = len(flowerbed)
while p < length-1:
if flowerbed[p] == 1:
p += 1
q = p+1
continue
else:
while q < length:
if flowerbed[q] == 1:
break
q += 1
zero_count = q - p
if zero_count % 2 == 0:
ans += zero_count/2 -1
else:
ans += int(zero_count/2)
p = q+1
q = p+1
return ans >= n
时间复杂度
O
(
n
)
O(n)
O(n),空间复杂度
O
(
1
)
O(1)
O(1)。
官方解答
贪心的思想,具体参考:官方解答。
public class Solution {
public boolean canPlaceFlowers(int[] flowerbed, int n) {
int i = 0, count = 0;
while (i < flowerbed.length) {
if (flowerbed[i] == 0 && (i == 0 || flowerbed[i - 1] == 0) && (i == flowerbed.length - 1 || flowerbed[i + 1] == 0)) {
flowerbed[i] = 1;
count++;
}
i++;
}
return count >= n;
}
}