LeetCode 605. 种花问题
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。
示例 1:
输入:flowerbed = [1,0,0,0,1], n = 1
输出:true
示例 2:
输入:flowerbed = [1,0,0,0,1], n = 2
输出:false
提示:
- 1 <= flowerbed.length <= 2 * 104
- flowerbed[i] 为 0 或 1
- flowerbed 中不存在相邻的两朵花
- 0 <= n <= flowerbed.length
解题思路: 找值为0 和它左右都为0 的元素,找到后res++;第一个 跟 最后一个元素特殊考虑,第一个只考虑右边元素是否为0,最后一个元素只考虑左边是否为0。
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int res = 0;
if(flowerbed.size() == 1 && flowerbed[0] == 0) { // 特殊考虑只有一个元素的时候
return true;
}
for(int i = 0;i < flowerbed.size();i++)
{
if(flowerbed[i] == 0)//考虑第一个元素
{
if(i == 0){
if(flowerbed[i+1] == 0)//如果右边为0,则满足条件,res++
{
flowerbed[i] = 1;//把满足条件的元素更新为1,避免把相邻的多个0计算进去
res++;
}
}
else if(i == flowerbed.size() - 1 ){//考虑最后一个元素
if(flowerbed[i-1] == 0) {//如果左边满足条件,res++
flowerbed[i] = 1;
res++;
}
}
else{//考虑其它位置的元素
if(flowerbed[i-1] == 0 && flowerbed[i+1] == 0) {//如果左边和右边都满足条件,res++
flowerbed[i] = 1;
res++;
}
}
}
}
return res >= n;
}
};