「这是我参与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))