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.
Notice
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.
Example 1:
Input: flowerbed = [1,0,0,0,1], n = 1
Output: True
Example 2:
Input: flowerbed = [1,0,0,0,1], n = 2
Output: False解题思路:
满足放置花的条件是当前位置以及它前一个与后一个位置的数均为0,才能放置一个花,所以这里使用指针遍历一遍若满足上述条件就把当前位置置1,且将记录的数量nums加1,继续考察下一个元素直到尾部。这个时候就统计出了这个花圃能放下最多花的数量nums,将其与n进行比较即可知道能否满足。
需要注意的是首尾元素的特殊性,可以将头部元素的左边与尾部元素的右边插入0保持其性质。
class Solution {
public:
/**
* @param flowerbed: an array
* @param n: an Integer
* @return: if n new flowers can be planted in it without violating the no-adjacent-flowers rule
*/
bool canPlaceFlowers(vector<int> &flowerbed, int n)
{
// Write your code here
if(n == 0)
return true;
flowerbed.insert(flowerbed.begin(),0);
flowerbed.push_back(0);
int nums = 0;
for(auto pt = flowerbed.begin()+1;pt != flowerbed.end()-1;pt++)
{
if(*(pt-1)==0 && *(pt+1)==0 && *pt == 0)
{
*pt = 1;
nums++;
}
}
if(nums >= n)
return true;
else
return false;
}
};
解决一个经典的编程问题:如何在不违反相邻花朵不能种植的规则下,在给定的花圃中种植尽可能多的新花。通过一次遍历并利用首尾元素的特殊处理,判断是否能在空位种植花朵。

被折叠的 条评论
为什么被折叠?



