Skip to content

No.605 种花问题

假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。

给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false 。

示例 1:

text
输入:flowerbed = [1,0,0,0,1], n = 1
输出:true

示例 2:

text
输入:flowerbed = [1,0,0,0,1], n = 2
输出:false

提示:

  • 1 <= flowerbed.length <= 2 * 10^4
  • flowerbed[i] 为 0 或 1
  • flowerbed 中不存在相邻的两朵花
  • 0 <= n <= flowerbed.length

解题思路

实现

改变原数组

js
/**
 * 改变原数组
 * @param {number[]} flowerbed
 * @param {number} n
 * @return {boolean}
 */
var canPlaceFlowers = function (flowerbed, n) {
  // 每种一朵花,n - 1,若 n <= 0 返回 true,反之则为 false
  // 不考虑边界
  flowerbed.unshift(0);
  flowerbed.push(0);
  for (let i = 1; i < flowerbed.length - 1; i++) {
    if (
      flowerbed[i - 1] === 0 &&
      flowerbed[i] === 0 &&
      flowerbed[i + 1] === 0
    ) {
      flowerbed[i] = 1; // 种花
      n--;
    }
  }
  return n <= 0;
};

不改变原数组

js
/**
 * 不改变原数组
 * @param {number[]} flowerbed
 * @param {number} n
 * @return {boolean}
 */
var canPlaceFlowers = function (flowerbed, n) {
  let i = 0;
  let len = flowerbed.length;
  while (i < len) {
    if (
      (i === 0 || flowerbed[i - 1] === 0) &&
      flowerbed[i] === 0 &&
      (i === len - 1 || flowerbed[i + 1] === 0)
    ) {
      n--;
      flowerbed[i] = 1;
    }
    i++;
  }
  return n <= 0;
};