Leetcode605——种花问题

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

给你一个整数数组 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 * 10e4
  • flowerbed[i] 为 0 或 1
  • flowerbed 中不存在相邻的两朵花
  • 0 <= n <= flowerbed.length

看到这个题,我的第一思路就是,查找连续0的个数,若连续有3个0,则在中间种上花(在数组对应位置的值设为1),对于两个边界进行分类讨论,简单题,思路很清晰

但是!

我看到了一种非常妙的思路,在原数组的头和尾添加两个0,这样就可以避免对边界的分类讨论,这种思想称为防御式编程。

可见,对于一个简单题,一个好的思路与规划还是可以使得编码的效率事半功倍的(*^▽^*)

复制代码
class Solution {
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        int len = flowerbed.length;
        int[] temp = new int[len+2];
        temp[0] = 0;
        temp[len+1] = 0;
        for(int i=0;i<len;i++)
        {
            temp[i+1] = flowerbed[i];
        }
        for(int i=1;i<=temp.length-2;i++)
        {
            if(temp[i]==0 && temp[i-1]==0 && temp[i+1]==0)
            {
                temp[i] = 1;
                n--;
            }
        }
        if(n<=0)
        {
            return true;
        }
        return false;
    }
}
复制代码

 

posted @   苏汐sama  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示