题目
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.
Example:
Input: flowerbed = [1,0,0,0,1], n = 1
Output: True
Input: flowerbed = [1,0,0,0,1], n = 2
Output: False
Note:
1. The input array won’t violate no-adjacent-flowers rule.
2. The input array size is in the range of [1, 20000].
3. n is a non-negative integer which won’t exceed the input array size.
思考
假设一朵花都没有种,下表为的位置个数与对应可种的花的数量:
位置数zero | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | … |
---|---|---|---|---|---|---|---|---|---|---|
可种花数量flower | 0 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | … |
由上表可以看出 flower=(zero+1)/2 (其中/为向下取整)
但是,如果前面或者后面有1,则不应该这么算。
1. 只有前面有1或者只有后面有1:
flower=(zero−1+1)/2
减去1旁边的0,因为两朵花不能相邻。
2. 前后都有1:
flower=(zero−2+1)/2
减去旁边的2个0。
答案
c++
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
if ((n > flowerbed.size() + 1) / 2) return false;
int zero = 0, flower = 0;
bool ones = false;
for (int i = 0; i < flowerbed.size(); i++) {
if (i != flowerbed.size() - 1 && flowerbed[i] == 0) {
zero += 1;
}
else {
if (i == flowerbed.size() - 1 && flowerbed[i] == 0) {
zero += 2;
}
if (!ones) {
zero++;
ones = true;
}
flower += (zero - 1) / 2;
zero = 0;
}
}
if (n <= flower) return true;
return false;
}
};
// 0 1 2 3 4 5 6 7 8
// 0 1 1 2 2 3 3 4 4