种花问题

139 阅读2分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

问题描述

假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。(出自leecode题目)

示例

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

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

解题思路

给出的花坛数组中只有两种可能,0(没种花)、1(已种花),并且,必须隔着种,两盆花不能相邻种植,中间必须隔着一个空盆;
这样的话我们可以来遍历一下数组,由于数组中只有两个数组 0 和 1,那么遍历的时候就只有两种情况,值是 0 或者 1;
当遍历到arr[i] 等于 1的时候,便表示这个花盆有种着花,下一个花盆就不能种花了,必须是 i+2 个花盆才有可能可以种花;
当遍历到arr[i] 等于 0的时候,前面可能没有花盆(比如刚在数组的首位时),也可能有花盆,但这个花盆绝对是个空花盆。接下来呢就需要判断 i+1 个花盆是否有种花,如果arr[i+1]不等1的话,那么arr[i]就可以种花,然后往后的下个循环要跳过两个花盆,顺便 n 要减一;如果arr[i+1]等于1的话,就表示这里已经有种花了,那就要跳过三个花盆。
当遍历结束后,n 若是等于 0 的话,那就表示 n 株花已经全部都种上去了,可以直接返回 true;若是 n 大于 0 的话,那就表示还有 n 株花还没有种下去,直接返回false。

解题过程

function flower(arr, n) {
  // 当n小于等于0时,花已经种完了,不需要再循环了
  for(let i=0; i<arr.length&&n>0;) {
    // 当前花盆已经种花了
    if(arr[i] == 1) {
      i += 2;
      // 当前花盆没有种花、下一个花盆没有种花并且不是最后一个花盆
    }else if(arr[i+1]!='undefined'&&arr[i+1] == 0) {
      n--;
      i += 2;
    // 下一个花盆已经种花了
    }else{
      i += 3;
    }
  }
  return n === 0;
}
console.log(flower([1,0,0,0,1,0,1, 0], 2))