假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花?能则返回True,不能则返回False。
示例 1:
输入: flowerbed = [1,0,0,0,1], n = 1
输出: True
这是leetcode上的一道贪心算法题,看了大部分解法都说要判断左右都没有种花,但是其实这题目的条件,还没有被充分利用,就是花卉不能种植在相邻的地块上,换种思路,就是测试用例不可能同时出现[1,1]两个连续的情况,那当我发现当前数是1时,那就完全可以跳过下一个数的判断,而当我发现当前数是0,下个数是1时,则可以跳过后两个数的判断,直接跳到后第三位数。
举例说明:
当出现[0(当前判断位),0]时,则可以在当前位种花,然后+2跳过后一位判断。
当出现[0(当前判断位),1,X,X)]时,则可以+3直接跳过,直接判断第4位的X。这里会有一个疑问,那就是如果直接在第四位种花,那第三位是1怎么办,但是我们根据题目的限制就知道,由于第2位是1,所以第三位一定只能为0。所以只要第四位右边为0,就可以种花,这种方法使得我们只需要判断右边的数,就可以达到种花不相邻的效果。
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int count = 0;
for(int i =0; i < flowerbed.size();)
{
if(flowerbed[i] == 0)
{
//判断是最后一位则种花退出
if(i == flowerbed.size() -1)
{
count++;
break;
}
//当前位为0,后第一位也为0,则种花不判断后第一位
if(flowerbed[i+1] == 0)
{
flowerbed[i] = 1;
count++;
i+=2;
}
//当前位为0,下一位为1,下第2位则无法种花,由于题目限制,所以后第二位必为0,此时可以直接跳过判断后第3位
else
{
i+=3;
}
}
//当前位为1,则可以跳过下一位判断,因为题目限制下一位一定为0
else
{
i+=2;
}
}
return n <= count;
}
};
总结,这里的题目限制条件不仅限制我们解法,同时也限制了测试用例,利用这个思路才想到了这种比较有意思解法,仅供参考,不一定是最优的方法。
本文探讨了一道经典的贪心算法题——花坛种花问题。通过对题目限制条件的深入理解,提出了一种高效的解题策略,即通过跳过特定位置的判断来减少不必要的计算,从而简化了问题并提高了算法效率。
857

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



