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)

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

posted @ 2022-03-20 17:07  ggaoda  阅读(20)  评论(0编辑  收藏  举报  来源