LeetCode 605.种花问题(贪心练习)
emm简单题也把我难住了。
整体思路
先看看题目吧:
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。
下面是示例和提示:
其实刚开始自己被各种没想到的情况折腾的不行,但其实还是没有找到能够一劳永逸的种花判断条件,看了力扣官方解答…emmm这是写了一篇作文了,然后发现其他人有更好更简洁的解法,为什么我就想不到呢。。。
-
不能出现连续的两个“1”,所给数组能种植的花大于等于n则返回true;
-
可以种花的条件是:
(外层循环)
①自己为空
&&
②左边为空或自己是最左边
&&
③右边为空或自己是最右边每循环一次则判断一次是否满足已种植n朵❀的条件,若满足则退出循环。
完整提交代码
class Solution {
public boolean canPlaceFlowers(int[] flowerbed, int n) {
for(int i=0; i<flowerbed.length; i++){
if (flowerbed[i]==0 && (i==0 || flowerbed[i-1]==0)
&& (i==flowerbed.length-1 || flowerbed[i+1]==0)){
//若满足种花条件则将该位置设为1,并将目标种花数目减1
flowerbed[i]=1;
n--;
//一旦剩余需要种植的花的数目小于等于0,则直接返回true
if(n<=0){
return true;
}
}
}
return n<=0;
}
}
总结
这道题的难易程度被标记为简单,虽然力扣官方解法看起来颇为复杂,但高手在民间,总能通过简单易懂清晰明了的方式解决“难”题,这种花问题的贪心之处很好理解,但在此过程中我发现了自身缺乏将各种情况融合起来的能力,这也导致了我无法写出正确的判断条件。