LeetCode第605题 - 种花问题

题目

解答

方案一

public class Solution {public boolean canPlaceFlowers(int[] flowerbed, int n) {if (flowerbed == null || flowerbed.length == 0) {return false;}if (flowerbed.length < 2) {return (flowerbed[0] == 1 ? 0 : 1) >= n;}if (flowerbed.length < 3) {int count = 0;if (flowerbed[0] == 0 && flowerbed[1] == 0) {count = 1;}return count >= n;}int length = flowerbed.length;int[] counts = new int[length];if (flowerbed[0] == 0 && flowerbed[1] == 0) {counts[0] = 1;}if (flowerbed[0] == 1) {counts[1] = 0;} else {// flowerbed[0] == 0counts[1] = flowerbed[1] == 1 ? 0 : 1;}int max = length - 1;for (int i = 2; i < max; ++i) {if (flowerbed[i - 1] == 1 || flowerbed[i] == 1 || flowerbed[i + 1] == 1) {counts[i] = counts[i - 1];} else {counts[i] = Math.max(counts[i - 2] + 1, counts[i - 1]);}if (counts[i] >= n) {return true;}}if (flowerbed[max] == 1 || flowerbed[max - 1] == 1) {counts[max] = counts[max - 1];} else {counts[max] = Math.max(counts[max - 2] + 1, counts[max - 1]);}return counts[max] >= n;}
}

方案二

public class Solution {public boolean canPlaceFlowers(int[] flowerbed, int n) {int length = flowerbed.length;int[] flowerbedNew = new int[length + 2];System.arraycopy(flowerbed, 0, flowerbedNew, 1, length);flowerbedNew[0] = 0;flowerbedNew[length + 1] = 0;for (int i = 1; i < length; ++i) {if (flowerbedNew[i - 1] == 0 && flowerbedNew[i] == 0 && flowerbedNew[i + 1] == 0) {--n;flowerbedNew[i] = 1;}if (n <= 0) {return true;}}if (n <= 0) {return true;}return false;}
}

要点
直观的说,方案一的实现很丑陋。
依据题目的定义,有个简单的思路,即每三个位置可以种一株花,那么在输入数据的前、后增加哨兵元素,可以规避边界条件的处理,一定程度上简化实现。
本题目在贪心算法的分类下,后续补充基于贪心算法的求解实现。

准备的用例,如下

@Before
public void before() {t = new Solution();
}@Test
public void test01() {assertTrue(t.canPlaceFlowers(new int[] { 1, 0, 0, 0, 1 }, 1));
}@Test
public void test02() {assertFalse(t.canPlaceFlowers(new int[] { 1, 0, 0, 0, 1 }, 2));
}@Test
public void test03() {assertFalse(t.canPlaceFlowers(new int[] { 1 }, 2));
}@Test
public void test04() {assertFalse(t.canPlaceFlowers(new int[] { 1 }, 1));
}@Test
public void test05() {assertTrue(t.canPlaceFlowers(new int[] { 1 }, 0));
}@Test
public void test06() {assertTrue(t.canPlaceFlowers(new int[] { 0 }, 0));
}@Test
public void test07() {assertFalse(t.canPlaceFlowers(new int[] { 1, 0 }, 2));
}@Test
public void test08() {assertFalse(t.canPlaceFlowers(new int[] { 1, 0 }, 1));
}@Test
public void test09() {assertTrue(t.canPlaceFlowers(new int[] { 0, 0 }, 1));
}@Test
public void test10() {assertFalse(t.canPlaceFlowers(new int[] { 0, 0 }, 2));
}@Test
public void test11() {assertFalse(t.canPlaceFlowers(new int[] { 1, 0, 0, 0, 0, 1 }, 2));
}@Test
public void test12() {assertTrue(t.canPlaceFlowers(new int[] { 0, 0, 1, 0, 1 }, 1));
}@Test
public void test13() {assertFalse(t.canPlaceFlowers(new int[] { 0, 1, 0 }, 1));
}@Test
public void test14() {assertFalse(t.canPlaceFlowers(new int[] { 1, 0, 1, 0, 0, 1, 0 }, 1));
}

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

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

相关文章

SpringBoot之@RequestParam注解

RequestParam &#xff08;org.springframework.web.bind.annotation.RequestParam&#xff09;用于将指定的请求参数赋值给方法中的形参。 有三个属性&#xff1a; &#xff08;1&#xff09;value&#xff1a;请求参数名&#xff08;必须配置&#xff09; &#xff08;2&…

【大数据】Flink 架构(三):事件时间处理

《Flink 架构》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 6 篇文章&#xff1a; Flink 架构&#xff08;一&#xff09;&#xff1a;系统架构Flink 架构&#xff08;二&#xff09;&#xff1a;数据传输Flink 架构&#xff08;三&#xff09;&#xff1a;事件…

<网络安全>《11 网络安全审计系统》

1 概念 审计是对资料作出证据搜集及分析&#xff0c;以评估企业状况&#xff0c;然后就资料及一般公认准则之间的相关程度作出结论及报告。 国际互联网络安全审计&#xff08;网络备案&#xff09;&#xff0c;是为了加强和规范互联网安全技术防范工作&#xff0c;保障互联网…

代码随想录训练营第三十一天|122.买卖股票的最佳时机II55.跳跃游戏45.跳跃游戏II

122.买卖股票的最佳时机II class Solution { public:int maxProfit(vector<int>& prices) {int earn0;for(int i 0; i < prices.size()-1;i){int x prices[i 1] - prices[i];if(x>0){earnx;}}return earn;} }; 55.跳跃游戏 本题关键在于看覆盖的范围 利…

基于C#制作一个俄罗斯方块小游戏

目录 引言游戏背景介绍游戏规则游戏设计与实现开发环境与工具游戏界面设计游戏逻辑实现游戏优化和测试性能优化测试工具和流程说明引言 俄罗斯方块是一款经典的益智游戏,深受玩家喜爱。本文将介绍如何使用C#编程语言制作一个简单的俄罗斯方块小游戏,并探讨其设计与实现过程。…

opencv-python 视频读取: VideoCapture.get()参数详解

视频读取demo import cv2 from tqdm import tqdmvideoCapture cv2.VideoCapture(video_path) if not videoCapture.isOpened(): # 若视频文件读取失败&#xff0c;读取下一段视频print(视频打开失败!!!)print(video_path)return False total_frames int(videoCapture.get(c…

【蓝桥杯日记】复盘篇二:分支结构

前言 本篇笔记主要进行复盘的内容是分支结构&#xff0c;通过学习分支结构从而更好巩固之前所学的内容。 目录 前言 目录 &#x1f34a;1.数的性质 分析&#xff1a; 知识点&#xff1a; &#x1f345;2.闰年判断 说明/提示 分析&#xff1a; 知识点&#xff1a; &am…

如何使用 Google 搜索引擎保姆级教程(附链接)

前言 需要挂梯子 一、介绍 "Google语法"通常是指在 Google 搜索引擎中使用一系列特定的搜索语法和操作符来精确地定义搜索查询。这些语法和操作符允许用户过滤和调整搜索结果&#xff0c;提高搜索的准确性。 二、安装 Google 下载 Google 浏览器 Google 官网ht…

自动化测试——selenium工具(web自动化测试)

1、自动化测试 优点&#xff1a;通过自动化测试有效减少人力的投入&#xff0c;同时提高了测试的质量和效率。 也用于回归测试。随着版本越来越多&#xff0c;版本回归的压力越来越大&#xff0c;仅仅通过人工测试 来回归所以的版本肯定是不现实的&#xff0c;所以…

如何在 Ubuntu 中安装 Microsoft Edge 浏览器

微软终于聪明了一回&#xff0c;也学会了「打不过就加入」。Microsoft Edge 浏览器的 Linux 稳定版已经于 2020 年 10 月 23 日发布&#xff0c;并提供给 Linux 发行版使用。除了官方 Edge APT 源以外&#xff0c;还提供了.deb和.rpm格式的安装包。 Microsoft Edge 基于 Chrom…

【Linux操作系统】:Linux开发工具编辑器vim

目录 Linux 软件包管理器 yum 什么是软件包 注意事项 查看软件包 如何安装软件 如何卸载软件 Linux 开发工具 Linux编辑器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 插入模式 插入模式切换为命令模式 移动光标 删除文字 复制 替换 撤销 跳至指…

Python爬虫解析库安装

解析库的安装 抓取网页代码之后&#xff0c;下一步就是从网页中提取信息。提取信息的方式有多种多样&#xff0c;可以使用正则来提取&#xff0c;但是写起来相对比较烦琐。这里还有许多强大的解析库&#xff0c;如 lxml、Beautiful Soup、pyquery 等。此外&#xff0c;还提供了…

备战蓝桥杯---数据结构与STL应用(基础实战篇1)

话不多说&#xff0c;直接上题&#xff1a; 当然我们可以用队列&#xff0c;但是其插入复杂度为N,总的复杂度为n^2,肯定会超时&#xff0c;于是我们可以用链表来写&#xff0c;同时把其存在数组中&#xff0c;这样节点的访问复杂度也为o(1).下面是AC代码&#xff1a; 下面我们来…

Shell中sed编辑器

1.简介 sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据&#xff0c;这些命令要么从命令行中输入&#xff0c;要么存储在一个 命令文本文件中。 2.sed编辑器的工作流程 sed…

《元梦之星》bug层出不穷,逼得玩家研发“自救套路”?

对于bug&#xff0c;想必喜爱游戏的玩家都不会陌生&#xff0c;在各类软件或者游戏中偶尔会出现一些影响正常运行的bug&#xff0c;但是并不会引起很大的反响。大家之所以能以平常心看待是因为各大游戏或者是应用软件中的bug都会因为玩家的及时发现而进行修复&#xff0c;在出现…

软件价值3-A*算法寻路

A*算法&#xff08;A-star算法&#xff09;是一种启发式搜索算法&#xff0c;主要用于在图或网络中找到从起始节点到目标节点的最佳路径。它结合了Dijkstra算法的广度优先搜索和贪婪最优优先搜索的特点&#xff0c;通过估算从起始节点到目标节点的代价来指导搜索方向。 A*算法…

Android中属性property_get和property_set的详细用法介绍

1&#xff0c;property_get和property_set的作用说明 在Android操作系统中&#xff0c;property_get和property_set是用于获取和设置系统属性的函数。这些属性通常用于存储和读取配置信息&#xff0c;例如设备配置、网络设置、系统参数等。 property_get函数用于获取指定属性…

二叉树中和为某一值的路径

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

MySQL 函数参考手册(MySQL 日期函数)

目录 MySQL ADDDATE() 函数 MySQL ADDTIME() 函数 MySQL CURDATE() 函数 MySQL CURRENT_DATE() 函数 MySQL CURRENT_TIME() 函数 MySQL CURRENT_TIMESTAMP() 函数 MySQL CURTIME() 函数 MySQL DATE() 函数 MySQL DATEDIFF() 函数 MySQL DATE_ADD() 函数 MySQL DATE_…

一、创建Vue3项目

1. 下载 node.js 下载地址&#xff1a;https://nodejs.org/zh-cn 优先选择 16 版本; node -v || node -version 可以检查本地 node.js 版本 2. 设置淘宝镜像源 npm config set registry https://registry.npmmirror.com/ 设置淘宝镜像源 npm config get registry 查看当前镜像…