数据结构与算法-LeetCode 莳花题目(No.605)

LeetCode 605. 莳花题目

假定你有一个很长的花坛,一部份地块莳植了花,另一部份却没有。然则,花草不能莳植在相邻的地块上,它们会争取水源,二者都邑死去。

给定一个花坛(示意为一个数组包括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
注重:
数组内已种好的花不会违背莳植划定规矩。
输入的数组长度局限为 [1, 20000]。
n 黑白负整数,且不会凌驾输入数组的大小。

我的思绪

总的来说,这道题在leetCode 中不算难的,症结就是要有思绪。下面是我本身做题时的剖析。
1. 在双方都是花 中心都是旷地的状况下(症结前提) ,算出可以莳花的最值。如[1,0,0,0,0,1]=>1
    一连旷地数 可莳花的最值
           0  => 0
           1  => 0
           2  => 0
           3  => 1
           4  => 1
           5  => 2
           6  => 2
           7  => 3

有觉得的老哥 ,预计已经有了主意,没错就是

parseInt((n - 1) / 2 ) = 可以种几颗 // (n为近来两个花 之间的旷地数目)

得出了这个结论 就基本完成了 然则另有2种特殊状况,以下是完全代码(打败84%的js提交)

let canPlaceFlowers = (flowerbed, n) => {
  let filedBegin = flowerbed[0] > 0 ? true : false;
  let filedEnd = flowerbed[flowerbed.length - 1] > 0 ? true : false;
  if (!filedBegin) {
    flowerbed.unshift(1, 0)
  }
  if (!filedEnd) {
    flowerbed.push(0, 1)
  }
  //上面步骤的缘由
  // 碰到这两种状况[0, 0, 1, 0, 0]  或许[0]
  // 根据parseInt((n - 1) / 2)  划定规矩得出的都是零 由于这类算法 是以  双方都是花的状况下的效果
  // 而上面这两种 0的两面 或许有一面 是没有花的 所以手动 给他们加上
  // [0, 0, 1, 0, 0]=> [1, 0, 0, 1, 0, 0, 0, 1]
  // [0]=> [1, 0, 0, 0, 1]
  // 如许就相符我们的划定规矩了

  let size = 0  //近来两个花 之间的旷地数目
  let canfiled = 0 //可以莳植的数目
  for (let i = 1, len = flowerbed.length; i < len; i++) {
    if (flowerbed[i] > 0) {//
      if (size == 0) continue //申明 处在 1 1 相邻的状况 直接跳过
      let num = parseInt((size - 1) / 2) // 当前距离最多可以莳植的数目
      canfiled += num
      size = 0 //重置距离数目
    } else {//当前是旷地  旷地数目+1
      size++
    }
  }
  return canfiled >= n
};

2.最快的类型

这类思绪是以每一个轮回的元素为中心 当 当前旷地元素的前一个元素和后一个元素为旷地 那末代表着可以莳植,(固然 依旧要考虑到目的数组的头尾为旷地0的状况) 而且直接转变原数组 flowerbed[j] = 1 ->这是他逻辑中一语道破的步骤

var canPlaceFlowers = function (flowerbed, n) {
  // 定义一个sum = 0
  // 遍历花坛,找到如许一个位置,此位置空,&& 前后都为空,则sum+1
  // 推断sum与n大小比较
  [0, 1, 0]
  if (!n) return true;
  var sum = 0
  var length = flowerbed.length
  for (var j = 0; j < length; j++) {
    if (!flowerbed[j]) {//当前是 旷地
      //关于右边的限定前提 true 示意可以莳植(仅关于左边来说)
      var leftVoid = j === 0 || flowerbed[j - 1] === 0
      //关于右边的限定前提 true 示意可以莳植(仅关于右边来说)
      var rightVoid = j === length - 1 || flowerbed[j + 1] === 0
      if (leftVoid && rightVoid) {
        // 可以莳植
        flowerbed[j] = 1  //直接将改位置 种上花  让背面的推断顺利进行  比较症结
        sum++
        if (sum === n) {  //轮回次数  能够少些 由于 sum的最大值是大于即是n 才满足
          return true
        }
      }
    }
  }

  return false
}

假如喜好LeetCode或许更多数据结构的内容,可以戳这里,迎接star

扫一扫

《数据结构与算法-LeetCode 莳花题目(No.605)》

往期文章

    原文作者:Love_Life
    原文地址: https://segmentfault.com/a/1190000019149355
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞