本文最后更新于 2024-03-23T16:23:25+00:00
原题:力扣《种花问题》
难度:简单
题目
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false 。
示例 1:
1 2
| 输入:flowerbed = [1,0,0,0,1], n = 1 输出:true
|
示例 2:
1 2
| 输入:flowerbed = [1,0,0,0,1], n = 2 输出:false
|
提示:
- 1 <= flowerbed.length <= 2 * 104
- flowerbed[i] 为 0 或 1
- flowerbed 中不存在相邻的两朵花
- 0 <= n <= flowerbed.length
解题
个人
关键:小算法 + 硬解的
- 规则:花不能相邻,则两个花之间 0 的数量 >= 1
- 要求:能否再种 n 朵花,那就是将现有的 0,按规则转为 1 后,看 n 是否还剩有,有剩的则不能种,否则能种
- 现有的 0 能否转为 1 呢?将它转为 1 后,判断前后是否都为 0,是则可转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
var canPlaceFlowers = function (flowerbed, n) { if (flowerbed.length < 2) { if (flowerbed.length === 0) return false; else if (flowerbed[0] === 0) return true; }
const placeFlower = (index) => { flowerbed[index] = 1; n--; };
for (let index = 0, len = flowerbed.length; index < len; index++) { const element = flowerbed[index];
if (element === 0) {
if (index === 0 && flowerbed[index + 1] === 0) { placeFlower(index); continue; }
if (flowerbed[index - 1] === 0 && flowerbed[index + 1] === 0) { placeFlower(index); continue; }
if (index === len - 1 && flowerbed[index - 1] === 0) { placeFlower(index); continue; } } }
return n <= 0; };
|
执行用时,消耗内存
61 ms,51.21 MB
耗时:23 min
官方
关键:贪心
思路:非常复杂,我看不懂
社区
关键:跳格子
思路:
- 当 f[index] 为 1 时,则表明当前已种花,那 index+1 必为 0,且不能种花,因此跳两格 index+2 重新判断
- 当 f[index] 为 0 时,则表明当前未种花,由于第一步遇 1 跳两格,则 index-1 必为 0,那只需要判断 index+1 是否为 1,若不为 1 则能种花并跳两格 index+2,若为 1 则不能种并跳三格 index+3 重新判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| var canPlaceFlowers = function (flowerbed, n) { if (flowerbed.length < 2) { if (flowerbed.length === 0) return false; else if (flowerbed[0] === 0) return n <= 1; } let start = 0;
while (start < flowerbed.length && n > 0) { if (flowerbed[start] === 0) { if (flowerbed[start + 1] === 0 || start == flowerbed.length - 1) { n--; start += 2; } else { start += 3; } } else { start += 2; } } return n <= 0; };
|
执行用时,消耗内存
67 ms,51.28 MB
总结
这次没具体的算法名称,所以靠自己找规律。