【LeetCode】数组-3(605)-种花问题( 1 的两侧不能有 1 )
开始的思路:首先统计需要种几只花,用花的数目统计连续 0 的个数.... ...【囧】突然觉得情况有点复杂啊,有连续的又有分散的怎么能统计全呢?
好吧这里喔偷偷的瞄了一眼参看答案... ...(就一眼就想通了)
思路一:
简单扫描统计,一个一个遍历,遍历到 i 的时候, i 前后的位置也要等于 0;
特殊情况 首尾有连续两个 0 的情况----首尾又可以种花了【笑脸】
程序中需要注意的点:
1. 满足条件的要放上 1;
2. 为防止下标越界,i+1 位的判断应该放到 || “短路或”的右边, i-1 位的判断应该放到 || “短路或”的左边。
【正确的代码】
public class Solution {
public boolean canPlaceFlowers(int[] flowerbed, int n) {
int i = 0;
int count = 0;
while (i < flowerbed.length) {
if ((flowerbed[i] == 0) && (i == flowerbed.length - 1 || flowerbed[i + 1] == 0) && (i == 0 || flowerbed[i - 1] == 0)) {
// i 没在头尾:需要判断 i-1 和 i+1 位置是不是0;i 在头,则 i+1 为 0 可以放一个; i 在尾,在 i-1 为 0 可以放一个
flowerbed[i] = 1;
count++;
}
i++;
}
if (count >= n) {
return true;
}
return false;
}
}
复杂度分析:
时间复杂度:O(n) 全遍历一遍
空间复杂度:O(1)
思路一的优化:
上面的count统计的是最多能种花的数量,如果n的值很小,则统计最多的数量就有些浪费了,所以我们可以把count和n的比较放到循环中进行,一旦count > n 就立即return true 减少计算量。
【正确的代码】
public class Solution {
public boolean canPlaceFlowers(int[] flowerbed, int n) {
int i = 0;
int count = 0;
while (i < flowerbed.length) {
if ((flowerbed[i] == 0) && (i == flowerbed.length - 1 || flowerbed[i + 1] == 0) && (i == 0 || flowerbed[i - 1] == 0)) {
flowerbed[i] = 1;
count++;
}
if (count >= n)
return true;
i++;
}
return false;
}
}
复杂度分析:
时间复杂度:O(n) 最坏的情况是全遍历一遍
空间复杂度:O(1)
【LeetCode】数组-3(605)-种花问题( 1 的两侧不能有 1 )的更多相关文章
- LeetCode 605. 种花问题(Can Place Flowers) 6
605. 种花问题 605. Can Place Flowers 题目描述 假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. ...
- Java实现 LeetCode 605 种花问题(边界问题)
605. 种花问题 假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. 给定一个花坛(表示为一个数组包含0和1,其中0表示没种 ...
- Leetcode数组题*3
目录 Leetcode数组题*3 66.加一 题目描述 思路分析 88.合并两个有序数组 题目描述 思路分析 167.两数之和Ⅱ-输入有序数组 题目描述 思路分析 Leetcode数组题*3 66.加 ...
- LeetCode 数组分割
LeetCode 数组分割 LeetCode 数组怎么分割可以得到左右最大值的差值的最大 https://www.nowcoder.com/study/live/489/1/1 左右最值最大差 htt ...
- LeetCode数组中重复的数字
LeetCode 数组中重复的数字 题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. ...
- Leetcode 605.种花问题
种花问题 假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. 给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表 ...
- leetcode(js)算法605之种花问题
假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. 给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花 ...
- 力扣(LeetCode)605. 种花问题
假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. 给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花 ...
- LeetCode数组解题模板
一.模板以及题目分类 1.头尾指针向中间逼近 ; ; while (pos1<pos2) { //判断条件 //pos更改条件 if (nums[pos1]<nums[pos2]) pos ...
随机推荐
- Web自动化之Headless Chrome概览
Web自动化 这里所说的Web自动化是所有跟页面相关的自动化,比如页面爬取,数据抓取,页面内容检测,页面功能测试,页面加载性能测试,页面回归测试等等,当前主要由如下几种解决方式: 文本数据获取 这就是 ...
- [图形学] Chp14 GLU曲面裁剪函数程序示例及样条表示遗留问题
样条表示这章已经看完,最后的GLU曲面裁剪函数,打算按书中的示例实现一下,其中遇到了几个问题. 先介绍一下GLU曲面裁剪函数的使用方法. 1 裁剪函数是成对出现的: gluBeginTrim和gluE ...
- win32SDK的hello,world程序(二)
接上篇,原生的控件都不太好看,所以决定自己画一个,稍微处理下消息就能用了.不过,美化这东西是需要天赋的.即使技术再好,没有对UI布局调整和良好的审美能力,做出来的东西还是很挫. 主要把消息逻辑和画的过 ...
- 深度理解Node.js单线程模型
Node.js采用 事件驱动 和 异步I/O 的方式,实现了一个单线程.高并发的运行时环境,而单线程就意味着同一时间只能做一件事,那么Node.js如何利用单线程来实现高并发和异步I/O?本文将围绕这 ...
- 阅读MDN文档之布局(四)
Introducing positioning Static positioning Relative positioning Introducing top, bottom, left and ri ...
- Carbondata源码系列(一)文件生成过程
在滴滴的两年一直在加班,人也变懒了,就很少再写博客了,最近在进行Carbondata和hive集成方面的工作,于是乎需要对Carbondata进行深入的研究. 于是新开一个系列,记录自己学习Carbo ...
- js验证身份证号码
function IdentityCodeValid(code) { var city={11:"北京",12:"天津",13:"河北",1 ...
- 新浪微博的OAuth2认证过程
1. 创建应用 在weibo.com上申请一个应用,获取app key和app secret, 填写redirect uri 2. 获取code 通过在浏览器访问 https://api.weibo. ...
- ssh连接异常:read from socket failed connection reset by peer
我出现这个问题的原因是:之前将/etc的权限设为777, 这是一个错误的操作!!然后我把权限修改过来(chmod 400 /etc) 重启服务(/bin/systemctl restart ssh.s ...
- 对JavaScript闭包的理解
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 在开始了解闭包前我们必须要先理解JavaScript的变量作用域. 一.变量的作用域无非就是两 ...