铁匠行会学徒

个人学习笔记

1.种花问题


LeetCode 种花问题(难度:简单)

假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。

给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 。能否在不打破种植规则的情况下种入 朵花?能则返回True,不能则返回False。

示例 1:

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

示例 2:

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



解题思路

想了好久也没有什么技巧,

只能采用原始的方式,对比前后两个元素,

①如果flowerbed[i]与flowerbed[i+1]都是0(都没有放花),就放一盘。

可是放在哪里呢?是放在i还是放在i+1的位置上呢,尝试很多次后,发现只能放在i+1上

放在i上是不可以纠错的

比如,从下面两个0的地方选一个放花,如果放在前面那个(i),明显不符合提议,而且也没法纠错

如果放在后面(i+1),

原来:0 1 0 1 1 0 0 1         放在i上:0 1 0 1 1 1 0 1    放在i+1上:0 1 0 1 1 0 1 1             

虽然i+1的位置也不符合,但是可以纠错

如果flowerbed[i]与flowerbed[i+1]都为1,那就把i位置上的花拿掉

纠错:下面红色(i)和蓝色(i+1)的地方都为1,去掉i,即红色位置上的花

纠错前:0 1 0 1 1 0 1 1     纠错后:0 1 0 1 1 0 0 1

所以可以得到代码

            for(int i=0;i<f-1;++i){
                if(flowerbed[i]+flowerbed[i+1]==0){
                    ++flowerbed[i+1];
                    ++num;
                }
                if(flowerbed[i]+flowerbed[i+1]==2){
                    --flowerbed[i];--num;
                }
            }
num为可摆花的个数,++flowerbed[i+1]或--flowerbed[i]是摆花操作


②上面是对于元素个数为双数的,可是如果为奇数,还剩1个怎么判断呢?

显然不能以末尾是0或1判断,谁知道倒数第二位是不是0呢

所以如果倒数第一、二位为0,就可以放花,可摆花的个数加1,有

            if(f%2==1 && flowerbed[f-1]==0 && flowerbed[f-2]==0){
                num++;
            }


③相比于末尾,首位判断更加闹心,多次解答错误原因就是没有对首两位判断

比如下面,按照道理来说,应该放在首位吧?可是由于①的纠错算法,放到i+1也就是首第2位去了

很自然少了一位

原来:0 0 1 0 0 1     该放的地方:1 0 1 0 0 1    实际上放的地方: 0 1 1 0 0 1

对于这种情况,干脆首位为0就在首位放花,就算首第二位为1也可以纠错,添上:

if(flowerbed[0]==0){++num;++flowerbed[0];}

④上面是算法只有数组元素个数大于1才管用,不过对于个数为1的还不好判断吗?

全部代码

class Solution {
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        int f=flowerbed.length,num=0;
        if(flowerbed[0]==0){++num;++flowerbed[0];}
        if(f>1){
            for(int i=0;i<f-1;++i){
                if(flowerbed[i]+flowerbed[i+1]==0){
                    ++flowerbed[i+1];
                    ++num;
                }
                if(flowerbed[i]+flowerbed[i+1]==2){
                    --flowerbed[i];--num;
                }
            }
            if(f%2==1 && flowerbed[f-1]==0 && flowerbed[f-2]==0){
                num++;
            }
        }

        if(num>=n){return true;}else{return false;}
    }
}

总结

刚入leetcode坑不到两天,没有养成写题前打草稿写思路的好习惯,想到什么就写什么上去,经常因为考量不周导致解答错误,浪费了好几个小时。

以后刷题一定要先写思路,先弄几个特殊一点的实例调试一下,确保无误再提交


阅读更多
个人分类: leetcode刷题算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

1.种花问题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭