0
点赞
收藏
分享

微信扫一扫

2022.04.19(LC_605_种花问题)

微言记 2022-04-19 阅读 43
java

 方法:贪心

class Solution {
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        //特判
        if (n == 0) return true;
        int len = flowerbed.length;
        //只有一个地块
        if (len == 1) {
            //此时 n = 1
            if (flowerbed[0] == 0) {
                return true;
            } else {
                return false;
            }
        }
        //至少有两个地块
        for (int i = 0; i < len - 1; i++) {
            if (flowerbed[i] == 0) {
                if (i == 0) {
                    if (flowerbed[i + 1] == 0) {
                        flowerbed[i] = 1;
                        n--;
                    }
                } else {
                    if (flowerbed[i - 1] == 0 && flowerbed[i + 1] == 0) {
                        flowerbed[i] = 1;
                        n--;
                    }
                }
            }
        }
        //对右边界进行特判
        if (flowerbed[len - 1] == 0 && flowerbed[len - 2] == 0) n--;
        if (n <= 0) return true;
        return false;
    }
}
class Solution {
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        //特判
        if (n == 0) return true;
        int len = flowerbed.length;
        for (int i = 0; i < len; i += 2) {
            //如果flowerbed[i] == 1,
            //下一个可以种花的位置为 i + 2
            //如果flowerbed[i] == 0,判断是否能种花
            if (flowerbed[i] == 0) {
                //由于每次碰到1都是跳两个位置,并且flowerbed 中不存在相邻的两朵花
                //如果最后的位置为0,那么前一位置必定为0,可以种花
                //或者当前位置为0,下一个位置为0,也可以种花
                if (i == len - 1 || flowerbed[i + 1] == 0) {
                    n--;
                //如果当前位置为0,但下一个位置为1
                //则跳到下一个位置,最后使得再跳两个位置
                } else {
                    i++;
                }
            }
        }
        return n <= 0;
    }
}
举报

相关推荐

0 条评论