这是我参与2022首次更文挑战的第38天,活动详情查看:2022首次更文挑战
前言
- 有人相爱,有人夜里开车看海,有人
leetcode第一题都做不出来,由此可见,leetcode的题还是有分量的。今天我们就来会会它们
题目地址
题目描述
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 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
贪心
思路
-
判断能否在不打破种植规则的情况下在花坛内种入 n 朵花,从贪心的角度考虑,应该在不打破种植规则的情况下种入尽可能多的花,然后判断可以种入的花的最多数量是否大于或等于 n。
-
假设花坛的下标 i 和下标 j 处都种植了花,其中 j−i≥2,且在下标 [i+1,j−1] 范围内没有种植花,则只有当 j−i≥4 时才可以在下标 i 和下标 j 之间种植更多的花,且可以种植花的下标范围是 [i+2,j−2]。可以种植花的位置数是 p=j−i−3,当 p 是奇数时最多可以在该范围内种植 (p+1)/2 朵花,当 p 是偶数时最多可以在该范围内种植 p/2 朵花。由于当 p 是偶数时,在整数除法的规则下 p/2 和 (p+1)/2 相等,因此无论 p 是奇数还是偶数,都是最多可以在该范围内种植 (p+1)/2 朵花,即最多可以在该范围内种植 (j−i−2)/2 朵花。
-
上述情况是在已有的两朵花之间种植花的情况(已有的两朵花之间没有别的花)。假设花坛的下标 ll 处是最左边的已经种植的花,下标 rr 处是最右边的已经种植的花(即对于任意 k<l 或 k>r 都有 flowerbed[k]=0,如何计算在下标 l 左边最多可以种植多少朵花以及在下标 r 右边最多可以种植多少朵花?
-
下标 l 左边有 l 个位置,当 l<2 时无法在下标 l 左边种植花,当 l≥2 时可以在下标范围 [0,l−2] 范围内种植花,可以种植花的位置数是 l−1,最多可以种植 l/2 朵花。
解法
/**
* @param {number[]} flowerbed
* @param {number} n
* @return {boolean}
*/
var canPlaceFlowers = function (flowerbed, n) {
var num = 0, count = 1;
for (var i = 0; i < flowerbed.length; i++) {
if (flowerbed[i] == 0) {
count++;
} else {
count = 0;
}
if (count == 3) {
num++;
count = 1;
}
}
// 如果最后count为2而不是1,表示最后一个位置可以种花
if (count == 2) {
num++;
}
return n <= num;
};
提示:
1 <= flowerbed.length <= 2 * 104
flowerbed[i] 为 0 或 1
flowerbed 中不存在相邻的两朵花
0 <= n <= flowerbed.length
写在最后
- 希望你能收获满满