假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。
怎么说呢 题目标签给的难度是easy
确实是一开始我就有点思路了
不过我硬着头皮在边界去分情况去判断可不可以种花
运行也确实行
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int count = 0;
int m = flowerbed.size();
if (m == 1)
{
if(flowerbed[0] == 0)
count++;
}
else
{
for (int i = 0; i < m; i++)
{
if (i == 0 || i == m - 1)
{
if (i == 0 && flowerbed[i] == 0)
{
if (flowerbed[i + 1] == 0)
{ count ++;
flowerbed[i] = 1;
continue;
}
}
if (i == m - 1 && flowerbed[i] == 0)
{
if (flowerbed[i - 1] == 0)
{
count ++;
flowerbed[i] = 1;
continue;
}
}
}
else
{
if (flowerbed[i] == 1)
continue;
else
{
if (flowerbed[i - 1] == 0 && flowerbed[i + 1] == 0)
{ count ++;
flowerbed[i] = 1;
continue;
}
}
}
}
}
if (n > count)
return false;
else
return true;
}
};
这是我这时的代码 特别的繁琐
后面看了下题解 可以在数组两端各加个0 这样就可以简化边界条件 确实是 我是用c++写的 想了老九才想到用insert在begin和end插入0 但时间复杂度 和内存消耗还不够好
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
flowerbed.insert(flowerbed.begin(), 0);
flowerbed.insert(flowerbed.end(),0);
int count = n;
for (int i = 1; i < flowerbed.size() - 1; i++)
{
if (flowerbed[i - 1] == 0 && flowerbed[i] == 0 && flowerbed[i + 1] == 0)
{
flowerbed[i] = 1;
count--;
}
}
return count <= 0? true:false;
}
};
后面再去看题解有一种跳格子办法就很棒 very good 很nb
省事 贴个链接算了跳格子方法
还有就是我觉得官方解法那个贪心思想太复杂了 压根不想看 !!!!