关键词:贪心算法

1. 题目描述

假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花?能则返回True,不能则返回False。
示例 1:

  1. 输入: flowerbed = [1,0,0,0,1], n = 1
  2. 输出: True

示例 2:

  1. 输入: flowerbed = [1,0,0,0,1], n = 2
  2. 输出: False

注意:

  1. 数组内已种好的花不会违反种植规则。
  2. 输入的数组长度范围为 [1, 20000]。
  3. n 是非负整数,且不会超过输入数组的大小。

    2. 解题思路

    这道题最直接的思路就是遍历每一个位置,只有在三个连续为 0 的地块,中间的位置才可以栽花,当满足条件时,我们就继续往后遍历,直到遍历完所有的位置。最后比较栽花的数量和n的大小即可。

需要注意的是边界值:在第一个位置时,前面是没有位置的;在最后一个位置时,后面是没有位置的。这样的话,只要最开始两个和最后面两个是0,第一个位置和最后一个位置就都可栽花。所以,这里我们不能判断i - 1i + 1为0,而是要判断他们不为1。这样就处理了第一个之前和最后一个之后的值为undefined的情况。

时间复杂度:O(n),其中n为数组 flowerbed 的长度。
空间复杂度:O(1),额外使用的空间为常数。

3. 代码实现

  1. /**
  2. * @param {number[]} flowerbed
  3. * @param {number} n
  4. * @return {boolean}
  5. */
  6. var canPlaceFlowers = function(flowerbed, n) {
  7. let planNum = 0, len = flowerbed.length
  8. for(let i = 0; i < len; i++){
  9. if(flowerbed[i - 1] !== 1 && flowerbed[i] !== 1 && flowerbed[i + 1] !== 1){
  10. flowerbed[i] = 1
  11. planNum += 1
  12. }
  13. }
  14. return planNum >= n
  15. };

4. 提交结果

image.png