LeetCode 605.种花问题

这篇博客介绍了LeetCode 605题——种花问题,探讨了如何在不违反相邻种植规则的情况下种植n朵花。博主分享了其初解的困扰,以及看到更简洁解法后的感悟。关键在于判断条件:不能有连续的两个1,且满足可种植的花数量大于等于n。代码实现中,重点检查当前位置是否满足种植条件:自己为空、左侧为空或最左、右侧为空或最右。最后,博主反思了自身在处理复杂情况时的不足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode 605.种花问题(贪心练习)

emm简单题也把我难住了。

整体思路

先看看题目吧:

假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。

给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。

下面是示例和提示:
在这里插入图片描述
其实刚开始自己被各种没想到的情况折腾的不行,但其实还是没有找到能够一劳永逸的种花判断条件,看了力扣官方解答…emmm这是写了一篇作文了,然后发现其他人有更好更简洁的解法,为什么我就想不到呢。。。

  1. 不能出现连续的两个“1”,所给数组能种植的花大于等于n则返回true;

  2. 可以种花的条件是:
    (外层循环)
    ①自己为空
    &&
    ②左边为空或自己是最左边
    &&
    ③右边为空或自己是最右边

    每循环一次则判断一次是否满足已种植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;
    }
}

总结

这道题的难易程度被标记为简单,虽然力扣官方解法看起来颇为复杂,但高手在民间,总能通过简单易懂清晰明了的方式解决“难”题,这种花问题的贪心之处很好理解,但在此过程中我发现了自身缺乏将各种情况融合起来的能力,这也导致了我无法写出正确的判断条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值