种花问题
难度:
标签:
题目描述
代码结果
运行时间: 22 ms, 内存: 16.3 MB
/*
* 思路:
* 使用 Java Stream API 来实现相同的逻辑。由于 Stream API 不直接修改数组,我们需要映射成一个新数组。
* 然后使用相同的规则检查可以种花的地块。
*/
import java.util.stream.IntStream;
public class FlowerbedStream {
public boolean canPlaceFlowers(int[] flowerbed, int n) {
int count = (int) IntStream.range(0, flowerbed.length)
.filter(i -> flowerbed[i] == 0 && (i == 0 || flowerbed[i - 1] == 0) && (i == flowerbed.length - 1 || flowerbed[i + 1] == 0))
.peek(i -> flowerbed[i] = 1)
.count();
return count >= n;
}
}
解释
方法:
这个题解采用了一次遍历的贪心策略。通过遍历花坛,统计当前位置左右两侧连续0的个数,如果个数大于等于2,就可以种下一朵花。同时用一个变量 prev 记录上一朵已种花的位置,用于计算当前位置与上一朵花之间的间隔。最后再根据最后一朵花的位置,计算剩余的空位数量,更新可种花的总数 count。如果 count 大于等于 n,说明可以种下 n 朵花,返回 True,否则返回 False。
时间复杂度:
O(m)
空间复杂度:
O(1)
代码细节讲解
🦆
如何处理数组两端的边界情况,特别是当花坛开头和结束的地块都是0时?
▷🦆
在代码中,`prev` 初始化为-1,这样的设定是否会影响计算第一个位置(即索引为0)时可种花的数量?
▷🦆
题解中提到的‘左右两侧连续0的个数’如何准确计算,尤其是在花坛中间部分的0?
▷🦆
如果在遍历过程中已经可以种下所需数量的花,为什么还需要继续遍历直到数组末尾?
▷相关问题
提莫攻击
在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。
当提莫攻击艾希,艾希的中毒状态正好持续 duration
秒。
正式地讲,提莫在 t
发起攻击意味着艾希在时间区间 [t, t + duration - 1]
(含 t
和 t + duration - 1
)处于中毒状态。如果提莫在中毒影响结束 前 再次攻击,中毒状态计时器将会 重置 ,在新的攻击之后,中毒影响将会在 duration
秒后结束。
给你一个 非递减 的整数数组 timeSeries
,其中 timeSeries[i]
表示提莫在 timeSeries[i]
秒时对艾希发起攻击,以及一个表示中毒持续时间的整数 duration
。
返回艾希处于中毒状态的 总 秒数。
示例 1:
输入:timeSeries = [1,4], duration = 2 输出:4 解释:提莫攻击对艾希的影响如下: - 第 1 秒,提莫攻击艾希并使其立即中毒。中毒状态会维持 2 秒,即第 1 秒和第 2 秒。 - 第 4 秒,提莫再次攻击艾希,艾希中毒状态又持续 2 秒,即第 4 秒和第 5 秒。 艾希在第 1、2、4、5 秒处于中毒状态,所以总中毒秒数是 4 。
示例 2:
输入:timeSeries = [1,2], duration = 2 输出:3 解释:提莫攻击对艾希的影响如下: - 第 1 秒,提莫攻击艾希并使其立即中毒。中毒状态会维持 2 秒,即第 1 秒和第 2 秒。 - 第 2 秒,提莫再次攻击艾希,并重置中毒计时器,艾希中毒状态需要持续 2 秒,即第 2 秒和第 3 秒。 艾希在第 1、2、3 秒处于中毒状态,所以总中毒秒数是 3 。
提示:
1 <= timeSeries.length <= 104
0 <= timeSeries[i], duration <= 107
timeSeries
按 非递减 顺序排列
小行星碰撞
给定一个整数数组 asteroids
,表示在同一行的小行星。
对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相同的速度移动。
找出碰撞后剩下的所有小行星。碰撞规则:两个小行星相互碰撞,较小的小行星会爆炸。如果两颗小行星大小相同,则两颗小行星都会爆炸。两颗移动方向相同的小行星,永远不会发生碰撞。
示例 1:
输入:asteroids = [5,10,-5] 输出:[5,10] 解释:10 和 -5 碰撞后只剩下 10 。 5 和 10 永远不会发生碰撞。
示例 2:
输入:asteroids = [8,-8] 输出:[] 解释:8 和 -8 碰撞后,两者都发生爆炸。
示例 3:
输入:asteroids = [10,2,-5] 输出:[10] 解释:2 和 -5 发生碰撞后剩下 -5 。10 和 -5 发生碰撞后剩下 10 。
提示:
2 <= asteroids.length <= 104
-1000 <= asteroids[i] <= 1000
asteroids[i] != 0