每日两道leetcode

605. 种花问题 - 力扣(LeetCode)

题目

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

给你一个整数数组 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

提示:

  • 1 <= flowerbed.length <= 2 * 104
  • flowerbed[i]01
  • flowerbed 中不存在相邻的两朵花
  • 0 <= n <= flowerbed.length

思路

  1. 顺序遍历,只要相邻的位置没有1,则直接插入,若是插够了直接返回true,若是插满了还有剩直接返回false。

代码实现

cpp 复制代码
class Solution {
public:
    bool canPlaceFlowers(vector<int>& flowerbed, int n) {
        int length = flowerbed.size(), pre = 0, now = 0, next = 1;
        if(n == 0) return true;
        if(length == 1) {
            if(flowerbed[0] == 1) return false;
            else return true;
        }
        for(now = 0; now < length; now++) {
            // 这里我还试了三个数相加等于0这种判断方法,显著性地时间开销变大了,猜测是因为需要额外分配空间存放累加结果,而相加和判断相等也是涉及三次操作,所以额外的分配空间的过程就会浪费掉时间了。
            if(flowerbed[pre]==0 && flowerbed[now]==0 && flowerbed[next]==0) {
                flowerbed[now] = 1;
                n--;
                if(n == 0) return true; 
            }
            if(pre!=now) pre++;
            if(next != length-1) next++;
        }
        return false;
    }
};

复杂度分析

  • 时间复杂度:总共只涉及一次遍历,时间复杂度为O(n)。
  • 空间复杂度:O(1)。

官方题解

  • 好的,谢谢官方题解,都忘记这个方法属于贪心算法了。------因为如果两个1之间可以种花,那早点种是不会影响剩下的空间的种花的(具体的分析请看leetcode的题解),所以可以贪心的能种就种。
相关推荐
zhaoyqcsdn14 分钟前
建造者模式详解及其在自动驾驶场景的应用举例(以C++代码实现)
c++·笔记·设计模式
硬匠的博客16 分钟前
C++面向对象
开发语言·c++·单片机
龙萌酱24 分钟前
力扣每日打卡17 49. 字母异位词分组 (中等)
前端·javascript·算法·leetcode
好易学数据结构1 小时前
可视化图解算法:按之字形顺序打印二叉树( Z字形、锯齿形遍历)
数据结构·算法·leetcode·面试·二叉树·力扣·笔试·遍历·二叉树遍历·牛客网·层序遍历·z·z字形遍历·锯齿形遍历
慕容青峰1 小时前
【第十六届 蓝桥杯 省 C/Python A/Java C 登山】题解
c语言·c++·python·算法·蓝桥杯·sublime text
enyp801 小时前
C++抽象基类定义与使用
开发语言·c++
superior tigre1 小时前
C++学习:六个月从基础到就业——C++学习之旅:STL容器详解
c++·学习
硬匠的博客2 小时前
C++IO流
c++
大学生亨亨2 小时前
蓝桥杯之递归二
java·数据结构·笔记·算法
天天扭码2 小时前
一分钟解决 | 高频面试算法题——滑动窗口最大值(单调队列)
前端·算法·面试