leetcode-605. 种花问题

贪心算法

种花问题


题目详情

假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 01组成,其中 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

我的代码:

C++

class Solution 
{
public:
    bool canPlaceFlowers(vector<int>& flowerbed, int n) 
    {
        int len=flowerbed.size();
        for(int i=0;i<len;++i)
        {
            if(flowerbed[i]==0&&(i==0||flowerbed[i-1]==0)&&(i==len-1||flowerbed[i+1]==0))
            {
            --n;
            if(n==0)
            return true;
            flowerbed[i]=1;
            }
        }
    return n<=0;
    }
};

Java

class Solution {
    public boolean canPlaceFlowers(int[] flowerbed, int n) {

        int len = flowerbed.length;
        for (int i = 0; i < len; ++i){
            //能种花的前提条件
            //自己为空位置 & (自己是花坛最左位置 | 左边位置为空) & (自己为花坛最右位置 | 右边位置为空)
            if (flowerbed[i] == 0 && (i == 0 || flowerbed[i-1] == 0) && (i == len-1 || flowerbed[i+1] == 0)){
                --n;    //一朵一朵种
                if (n == 0) return true; //没遍历完花坛就种完了
                flowerbed[i] = 1;        //种完标记好位置
            }

        }


            return n <= 0? true : false;
    }
}

涉及知识点:

  1. 贪心算法(能种就种)

顾名思义,贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最
后得到的结果是全局最优的。

思路:

从左向右遍历花坛,在可以种花的地方就种一朵,能种就种(因为在任一种花时候,不种都不会得到更优解),就是一种贪心的思想
这里可以种花的条件是:

1.自己为空
2.左边为空 或者 自己是最左
3.右边为空 或者 自己是最右

中间n==0可跳出循环,末尾n<=0的原因是n可能为负数(当要求种0棵时也执行了一次–n)

这里转载评论区另一种解法:
真的牛
牛牛牛~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ggaoda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值