【数据结构和算法】种花问题

 其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


 文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

2.1 ​​​​​方法一:贪心

2.2 贪心算法一般思路

三、代码

3.1 ​​​​​方法一:贪心

四、复杂度分析

4.1 ​​​​​方法一:贪心 


前言

这是力扣的 605 题,难度为简单,解题方案有很多种,本文讲解我认为最奇妙的一种。


一、题目描述

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

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

二、题解

2.1 ​​​​​方法一:贪心

思路与算法:

题目要求是否能在不打破规则的情况下插入n朵花,与直接计算不同,采用“跳格子”的解法只需遍历不到一遍数组,处理以下两种不同的情况即可:

  1. 当遍历到index遇到1时,说明这个位置有花,那必然从index+2的位置才有可能种花,因此当碰到1时直接跳过下一格。
  2. 当遍历到index遇到0时,由于每次碰到1都是跳两格,因此前一格必定是0,此时只需要判断下一格是不是1即可得出index这一格能不能种花,如果能种则令n减一,然后这个位置就按照遇到1时处理,即跳两格;如果index的后一格是1,说明这个位置不能种花且之后两格也不可能种花(参照 1 ),直接跳过3格。

当n减为0时,说明可以种入n朵花,则可以直接退出遍历返回true;如果遍历结束n没有减到0,说明最多种入的花的数量小于n,则返回false。

2.2 贪心算法一般思路

贪心算法的思路是:从问题的某一个初始解出发,然后通过一系列的贪心选择,每一步都做出在当前看来最好的选择,从而希望导致结果是整体最优的算法。这个算法并不会从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。

具体来说,贪心算法的步骤如下:

  1. 建立数学模型来描述问题。
  2. 把求解的问题分成若干个子问题。
  3. 对每个子问题求解,得到子问题的局部最优解。
  4. 把子问题的解局部最优解合成原来解问题的一个解。

贪心算法的关键在于贪心选择性质和制定贪心策略,其中贪心选择性质是指问题的最优解可以通过一系列局部最优的选择达到,且每一步的选择依赖于以前作出的选择,但不依赖于后面要作出的选择。而贪心策略则是为了达到问题的最优解或较优解而制定的策略。

需要注意的是,贪心算法并不总是能够得到全局最优解,因为它每一步都只考虑当前的最优选择,而忽略了全局的情况。因此,贪心算法适用于那些具有最优子结构性质和贪心选择性质的问题。


三、代码

3.1 ​​​​​方法一:贪心

Java版本:

class Solution {public boolean canPlaceFlowers(int[] flowerbed, int n) {for (int i = 0; i < flowerbed.length && n > 0;) {if (flowerbed[i] == 1) {i += 2;} else if (i == flowerbed.length - 1 || flowerbed[i + 1] == 0) {n--;i += 2;} else {i += 3;}}return n <= 0;}
}

 C++版本:

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

Python版本:

class Solution:def canPlaceFlowers(self, flowerbed, n):i = 0while i < len(flowerbed) and n > 0:if flowerbed[i] == 1:i += 2elif i == len(flowerbed) - 1 or flowerbed[i + 1] == 0:n -= 1i += 2else:i += 3return n <= 0

Go版本: 

package main  import "fmt"  func canPlaceFlowers(flowerbed []int, n int) bool {  i := 0  for i < len(flowerbed) && n > 0 {  if flowerbed[i] == 1 {  i += 2  } else if i == len(flowerbed)-1 || flowerbed[i+1] == 0 {  n -= 1  i += 2  } else {  i += 3  }  }  return n <= 0  
}  func main() {  flowerbed := []int{1, 0, 0, 0, 1}  n := 1  result := canPlaceFlowers(flowerbed, n)  fmt.Println(result) // Output: true  
}

四、复杂度分析

4.1 ​​​​​方法一:贪心

  • 时间复杂度:O(m),其中 m 是数组 flowerbed 的长度。需要遍历数组一次。
  • 空间复杂度:O(1)。额外使用的空间为常数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/631213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器推送数据你还在用 WebSocket么?

当涉及到推送数据时,人们首先会想到 WebSocket。 的确,WebSocket 允许双向通信,可以自然地用于服务器到浏览器的消息推送。 然而,如果只需要单向的消息推送,HTTP 通过服务器发送的事件也有这种功能。 WebSocket 的通信过程如下: 首先,通过 HTTP 切换协议。服务器返回 101 状…

驾驭数字孪生:智慧水利的未来之路

一、数字孪生技术的原理与实践 随着科技的不断进步&#xff0c;数字孪生技术作为一项创新的技术应用&#xff0c;正在逐渐改变我们的生活和工作方式。特别是在工业领域&#xff0c;数字孪生技术被视为实现智能制造、提升生产效率和产品质量的重要手段。本章节将深入探讨数字孪…

k8s的对外服务--ingress

service作用体现在两个方面 1、集群内部 不断跟踪pod的变化&#xff0c;更新endpoint中的pod对象&#xff0c;基于pod的IP地址不断变化的一种服务发现机制 2、集群外部 类似负载均衡器&#xff0c;把流量ip端口&#xff0c;不涉及转发url&#xff08;http&#xff0c;https&a…

npm依赖库备份

常用命令 设置默认使用本地缓存安装Nodejs时会自动安装npm&#xff0c;但是局路径是C:\Users\Caffrey\AppData\Roaming\npm默认的缓存路径是C:\Users\Caffrey\AppData\Roaming\npm-cache&#xff1b;查看npm的prefix和cache路径配置信息设置路径 设置默认使用本地缓存 npm con…

C++ 11新特性之function

概述 C 11标准库引入了许多创新功能&#xff0c;其中之一便是std::function。作为函数对象容器&#xff0c;std::function允许开发者在编译时不知道具体类型的情况下&#xff0c;存储和传递任意可调用对象&#xff0c;极大地提升了代码的灵活性和可复用性。本文将详细探讨std::…

本周五上海见 第二届证券基金行业先进计算技术大会暨2024低时延技术创新实践论坛(上海站)即将召开

低时延技术是证券基金期货领域业务系统的核心技术&#xff0c;是打造极速交易系统领先优势的关键&#xff0c;也是证券基金行业关注的前沿技术热点。 1月19日下午&#xff0c;第二届证券基金行业先进计算技术大会暨2024低时延技术创新实践论坛&#xff08;上海站&#xff09;即…

springmvc上传与下载

文件上传 结构图 导入依赖 <dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId…

HTML中常用标签--详解

目录 1.b/strong标签 2.i/em 标签 3.u标签 4.del删除线 5.br换行 6.p标签 * 7.pre 预处理标签 8.span标签** 9.div标签*** 10.sub标签 11.sup标签 12.hr标签 13.hn标签 14.HTML5中语义标签 特殊字符 15.多媒体标签 img*** a 标签*** 第一种用法&#xff1a;…

MySQL之视图索引

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score)…

VSCODE使用CMAKE显示命令无法找到

背景&#xff1a;使用了code server&#xff0c;安装CMAKE和CMAKE TOOLS&#xff0c;但是通过ctrlshiftp打开命令面板&#xff0c;运行随便一个cmake指令&#xff0c;都出现了指令无法找到。具体为“命令"CMake: 配置"导致错误 (command ‘cmake.configure’ not fou…

vue3 系列:Vue3 官方文档速通

前言&#xff1a;参考Vue 官方文档&#xff0c;本文档主要学习组合式 API。 一 开始 1. 简介 1.1 什么是 Vue&#xff1f; 一款 JS 框架&#xff0c;并有两个核心功能&#xff1a;声明式渲染、响应性。 1.2 渐进式框架 根据不同的需求场景&#xff0c;使用不同方式的 Vue&am…

GPT APP的开发步骤

开发一个GPT&#xff08;Generative Pre-trained Transformer&#xff09; Store&#xff08;存储&#xff09;涉及到使用预训练的语言模型&#xff08;例如GPT-3&#xff09;来生成和管理内容。以下是一般的步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&…

探索设计模式的魅力:抽象工厂模式的艺术

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;用于在不指定具体类的情况下创建一系列相关或相互依赖的对象。它提供了一个接口&#xff0c;用于创建一系列“家族”或相关依赖对象&#xff0c;而无需指定它们的具体类。 主要参…

[足式机器人]Part2 Dr. CAN学习笔记- Kalman Filter卡尔曼滤波器Ch05-1+2

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - Kalman Filter卡尔曼滤波器 Ch05-12 1. Recursive Algirithm 递归算法2. Data Fusion 数据融合Covarince Matrix协方差矩阵State Space状态空间方程 Observation观测器 1. Recursive Algirithm…

docker环境下mongo副本集的部署及异常修复

最近更换了办公地点。部署在本地docker环境里的mongo数据库不能使用了。原因是本地的ip地址变更。以前的mongo副本集的配置需要更新。处理完后&#xff0c;索性重新记录一下mongo副本集在docker中的部署流程。 mongo的事务及副本集 我们先了解一下什么是事务&#xff0c;事务…

nestjs之定义provider的几种方式

在NestJS中可以以多种方式自定义Providers。以下是一些常见的方法&#xff1a; 1. 值提供者&#xff08;Value Providers&#xff09; 值提供者用于提供一些硬编码的值&#xff0c;例如配置对象或常量。这类提供者通过 useValue 关键字来指定要注入的值。 使用过程&#xff…

RK356x基于Ubuntu20.04搭建ROS开发环境

RK356x基于Ubuntu20.04搭建ROS开发环境 1、开发环境2、Ubuntu下安装步骤3、验证成果1、开发环境 CPU:RK356x 操作系统:arm64 Ubuntu20.04 2、Ubuntu下安装步骤 1、首先确保开发板是可以联网的。 root@hyb-RK356x:~# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,M…

selenium-java中切换iframe

1、当iframe中有固定的name或者id时可以通过name和id进行切换,代码如下 driver.switchTo().frame("name"); 2、当iframe中没有固定的name或者id时可以通过iframe角标进行切换&#xff0c;在浏览器通过ctrlf快捷键&#xff0c;搜索标签框输入//iframe;来查看当前ifr…

VsCode 常见的配置

转载&#xff1a;Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】 - 知乎 (zhihu.com) 一、VsCode 常见的配置 1、取消更新 把插件的更新也一起取消了 2、设置编码为utf-8&#xff1a;默认就是了&#xff0c;不用设置了 3、设置常用的…

Chrome 开发者工具

Chrome 开发者工具 介绍控制面板时间线下载信息概要请求列表单个请求时间线优化时间线上耗时项 lighthouse 插件Performance&#xff08;性能指标&#xff09;Accessibility&#xff08;可访问性&#xff09;Best Practices&#xff08;最佳实践&#xff09;SEO&#xff08;搜索…