题目:
Suppose you have a long flowerbed in which some of the plots are planted and some are not. However, flowers cannot be planted in adjacent plots - they would compete for water and both would die.
Given a flowerbed (represented as an array containing 0 and 1, where 0 means empty and 1 means not empty), and a number n, return if n new flowers can be planted in it without violating the no-adjacent-flowers rule.
分析:
- 对于边界位置,需要至少两个连续的0可种一枝花,对于中间位置,连续3个0可种一枝花;
- 为了统一边界和中心,方便处理,在给定列表首尾各加1个0,此时连续出现的K个0的区间可种(K - 1)// 2枝花;
- 如果在列表头部增加一个0,将导致整个列表每个元素复制并向后移动一次,增加O(n)级别操作;因此不实际在列表首部增加0,而是采用将0的初始计数直接设置为1的方式;在列表末尾添加0,只是一个O(1)级别的操作,因此实际进行添加操作。
代码:
class Solution(object):
def canPlaceFlowers(self, flowerbed, n):
"""
:type flowerbed: List[int]
:type n: int
:rtype: bool
"""
if n == 0:
return True
countZero = 1
plantNums = 0
flowerbed.append(0)
# print flowerbed
for x in flowerbed:
if x:
if countZero > 2:
# print countZero
plantNums += (countZero - 1) // 2
if plantNums >= n:
return True
countZero = 0
else:
countZero += 1
if countZero > 2:
plantNums += (countZero - 1) // 2
if plantNums >= n:
return True
return False
思考:
该代码在leetcode中提交时优于99.77%。最初没有处理n = 0的特殊状况。