news 2026/9/5 15:05:23

贪心题目:种花问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
贪心题目:种花问题

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:种花问题

出处:605. 种花问题

难度

3 级

题目描述

要求

有一个很长的花坛,一部分地块种植了花,另一部分地块没有种植花。可是,花不能种植在相邻的地块上。

给定一个整数数组flowerbed \texttt{flowerbed}flowerbed表示花坛,由0 \texttt{0}01 \texttt{1}1组成,其中0 \texttt{0}0表示没种植花,1 \texttt{1}1表示种植了花。另外给定一个整数n \texttt{n}n,判断是否能在不违反不相邻种花的规则下新种植n \texttt{n}n朵花。

示例

示例 1:

输入:flowerbed = [1,0,0,0,1], n = 1 \texttt{flowerbed = [1,0,0,0,1], n = 1}flowerbed = [1,0,0,0,1], n = 1
输出:true \texttt{true}true

示例 2:

输入:flowerbed = [1,0,0,0,1], n = 2 \texttt{flowerbed = [1,0,0,0,1], n = 2}flowerbed = [1,0,0,0,1], n = 2
输出:false \texttt{false}false

数据范围

  • 1 ≤ flowerbed.length ≤ 2 × 10 4 \texttt{1} \le \texttt{flowerbed.length} \le \texttt{2} \times \texttt{10}^\texttt{4}1flowerbed.length2×104
  • flowerbed[i] \texttt{flowerbed[i]}flowerbed[i]0 \texttt{0}01 \texttt{1}1
  • flowerbed \texttt{flowerbed}flowerbed中不存在相邻的两朵花
  • 0 ≤ n ≤ flowerbed.length \texttt{0} \le \texttt{n} \le \texttt{flowerbed.length}0nflowerbed.length

解法

思路和算法

为了判断是否可以在确保没有相邻的花的情况下新种植n nn朵花,需要计算在确保没有相邻的花的情况下最多可以新种植的花朵数。如果最多可以新种植的花朵数大于等于n nn,则返回true \text{true}true,否则返回false \text{false}false

m mm表示数组flowerbed \textit{flowerbed}flowerbed的长度。假设花坛中的位置x xxy yy种植了花,其中0 ≤ x < y < m 0 \le x < y < m0x<y<m,且位置x xxy yy之间没有种植花,即flowerbed [ x ] = flowerbed [ y ] = 1 \textit{flowerbed}[x] = \textit{flowerbed}[y] = 1flowerbed[x]=flowerbed[y]=1且对于任意x < z < y x < z < yx<z<y都有flowerbed [ z ] = 0 \textit{flowerbed}[z] = 0flowerbed[z]=0。当y − x < 4 y - x < 4yx<4时,位置x xxy yy之间不能新种植花;当y − x ≥ 4 y - x \ge 4yx4时,为了使新种植的花朵数最多,应使用贪心思想,应从位置x + 2 x + 2x+2开始向右种植花,且新种植的花之间的距离应取最小值2 22,此时位置x xxy yy之间可以新种植花的位置范围是[ x + 2 , y − 2 ] [x + 2, y - 2][x+2,y2],因此新种植的花朵数是⌊ y − x − 2 2 ⌋ \Big\lfloor \dfrac{y - x - 2}{2} \Big\rfloor2yx2。如果新种植的花与最近的花之间的距离大于2 22,则种植相同数量的花需要的位置范围一定大于等于[ x + 2 , y − 2 ] [x + 2, y - 2][x+2,y2],在位置范围[ x + 2 , y − 2 ] [x + 2, y - 2][x+2,y2]中可以种植的花朵数一定小于等于⌊ y − x − 2 2 ⌋ \Big\lfloor \dfrac{y - x - 2}{2} \Big\rfloor2yx2,因此贪心策略下新种植的花朵数最多。

x < 0 x < 0x<0y ≥ m y \ge mym时,由于花坛的边界没有花,因此需要使用其他方法计算最多可以新种植的花朵数。分别考虑以下三种情况。

  • x < 0 x < 0x<00 ≤ y < m 0 \le y < m0y<m时,位置范围[ 0 , y − 2 ] [0, y - 2][0,y2]中都可以新种植花,最多可以新种植的花朵数是⌊ y 2 ⌋ \Big\lfloor \dfrac{y}{2} \Big\rfloor2y

  • 0 ≤ x < m 0 \le x < m0x<my ≥ m y \ge mym时,位置范围[ x + 2 , m − 1 ] [x + 2, m - 1][x+2,m1]中都可以新种植花,最多可以新种植的花朵数是⌊ m − x − 1 2 ⌋ \Big\lfloor \dfrac{m - x - 1}{2} \Big\rfloor2mx1

  • x < 0 x < 0x<0y ≥ m y \ge mym时,位置范围[ 0 , m − 1 ] [0, m - 1][0,m1]中都可以新种植花,最多可以新种植的花朵数是⌊ m + 1 2 ⌋ \Big\lfloor \dfrac{m + 1}{2} \Big\rfloor2m+1

实现方面,遍历数组flowerbed \textit{flowerbed}flowerbed并计算最多可以新种植的花朵数,遍历过程中维护最多可以新种植的花朵总数count \textit{count}count以及上一朵花的位置prev \textit{prev}prev。为了方便计算,将prev \textit{prev}prev初始化为− 2 -22,确保可以新种植花的位置为非负整数。当遍历到下标i ii时,如果flowerbed [ i ] = 1 \textit{flowerbed}[i] = 1flowerbed[i]=1,则位置i ii种植了花,执行如下操作。

  1. 上一朵花和当前位置的花之间最多可以新种植的花朵数是⌊ i − prev − 2 2 ⌋ \Big\lfloor \dfrac{i - \textit{prev} - 2}{2} \Big\rfloor2iprev2,将其加到count \textit{count}count

  2. prev \textit{prev}prev的值更新为i ii

遍历结束之后,最后一朵花到花坛末尾之间最多可以新种植的花朵数是⌊ m − prev − 2 2 ⌋ \Big\lfloor \dfrac{m - \textit{prev} - 2}{2} \Big\rfloor2mprev2,将其加到count \textit{count}count。当count ≥ n \textit{count} \ge ncountn时返回true \text{true}true,否则返回false \text{false}false

prev \textit{prev}prev初始化为− 2 -22时,可以确保计算得到正确的花朵数,不需要判断prev \textit{prev}prev的值。

实现方面有一处可以优化。由于题目只要求判断是否可以新种植n nn朵花,不要求计算最多可以新种植的花朵数,因此当count ≥ n \textit{count} \ge ncountn时可以直接返回true \text{true}true,不需要继续遍历。

代码

classSolution{publicbooleancanPlaceFlowers(int[]flowerbed,intn){intcount=0;intm=flowerbed.length;intprev=-2;for(inti=0;i<m;i++){if(flowerbed[i]==1){count+=(i-prev-2)/2;if(count>=n){returntrue;}prev=i;}}count+=(m-prev-1)/2;returncount>=n;}}

复杂度分析

  • 时间复杂度:O ( m ) O(m)O(m),其中m mm是数组flowerbed \textit{flowerbed}flowerbed的长度。最多需要遍历数组flowerbed \textit{flowerbed}flowerbed一次。

  • 空间复杂度:O ( 1 ) O(1)O(1)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 15:02:42

aarch64 OpenSSL构建包深度解析与安全集成指南

简介&#xff1a;本资源是专为嵌入式与ARM平台开发者准备的aarch64架构OpenSSL交叉编译成果包&#xff0c;面向需在64位ARM服务器、边缘设备或移动终端上实现TLS/SSL安全通信的中高级开发人员。压缩包内含84个文件&#xff0c;涵盖静态库&#xff08;libcrypto.a、libssl.a&…

作者头像 李华
网站建设 2026/9/5 14:49:06

SAP CO成本管理51集完整教程:从基础到实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 14:46:47

基于YOLO与PyQt5的蜜蜂目标检测系统开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 14:46:47

STM32+W5500以太网UDP通信实战:硬件选型、驱动移植与调试指南

简介&#xff1a;本资源是一套面向物联网嵌入式开发者的STM32以太网通信实战工程&#xff0c;聚焦W5500硬件模块与UDP协议在STM32F103系列单片机上的完整实现&#xff0c;适用于初学者入门网络编程及工程师快速搭建联网终端。工程基于KEIL MDK开发&#xff0c;涵盖DHCP自动获取…

作者头像 李华
网站建设 2026/9/5 14:46:12

多低音炮阵列如何破解房间低频驻波?实测流程全解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 14:44:54

Unity工业级二维码硬件直驱方案:生成、显示与扫码枪稳定识别

简介&#xff1a;本资源是一个基于Unity引擎的硬件信息二维码生成与显示完整工程&#xff0c;面向Unity开发者、工业软件工程师及需要设备身份快速识别的物联网应用人员。项目利用ZXing开源库&#xff0c;将显卡、CPU等硬件机器码自动拼接为字符串并实时编码为可扫描二维码&…

作者头像 李华