力扣简单题: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;
}

完结

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页