力扣简单题:605:种花问题
话不多说上问题和代码
题目
讲讲我的思路
- 一开始想到的是遍历循环接收到的数组,然后根据当前位置去判断下一个种花点,于是就有了下面的代码,
- 以已经种花的点(也就是数组中为1的元素)当做坐标,去判断后面的点
/**
* @param {number[]} flowerbed
* @param {number} n
* @return {boolean}
*/
var canPlaceFlowers = function(flowerbed, n) {
for(var i = 0;i < flowerbed.length; i++) {
// 对第一个做特殊处理
if(i === 0) {
// 为了判断第一个点是否能种花
if(flowerbed[i] !== 1 && flowerbed[i+1] !== 1) {
n--;
flowerbed[i] = 1;
}
}
// 这里就是通用处理了,经过上面的处理,数组的第一位或者第二位一定有一个是1
if(flowerbed[i] === 1) {
// 此时根据当前遍历到的1去做判断,后面的第二位是否能够种花,能就将其变为1
if(flowerbed[i+2] === 0 && flowerbed[i+3] !== 1) {
// 能就将要种的花的数量减一
n--;
// 将花种下
flowerbed[i+2] = 1;
// 此时直接将遍历的i定位到种花的位置
i = i + 1;
}
}
// 当花种完了就直接返回true,此时数组可能还没遍历完,就不用再去进行后面的遍历了
if(n <= 0){return true};
}
// 当数组遍历完后,仍然没有种完就返回false
return false;
}
优化
- 又想到以零为坐标,直接判断当前点是否能种花就更简单了
/**
* @param {number[]} flowerbed
* @param {number} n
* @return {boolean}
*/
var canPlaceFlowers = function(flowerbed, n) {
for(var i = 0; i < flowerbed.length; i++) {
// 只要当前值为0,前一位不为1,后一位也不为1,就可以种花了,此时的情况包含了首位的处理
if(flowerbed[i-1] !== 1 && flowerbed[i] === 0 && flowerbed[i+1] !== 1) {
n--;
flowerbed[i] = 1;
i++;
}
}
// n <= 0 则表示花已经种完,返回true,反之则返回false
return n <= 0;
}
完结