Leetcode#605 种花问题

题目介绍

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

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

题目分析

本题的主要思路的是需要大约 3 个 0 才可以在中间种花,已存在不合理的种花可忽略,边界处可仅考虑单边。

第一次

实现的较为中规中矩,拿到当前下标判断左右两侧是否存在空格,并注意边界问题,其中 left 和 right 略显粗糙。

class Solution {
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        if (flowerbed != null && flowerbed.length > 0) {
            for (int i = 0; i < flowerbed.length; i++) {
                if (flowerbed[i] == 1) {
                    continue;
                }
                int left = Math.max(i - 1, 0);
                int right = i + 1 < flowerbed.length ? i + 1 : i;
                if (flowerbed[left] == 0 && flowerbed[right] == 0) {
                    flowerbed[i] = 1;
                    n--;
                }
            }
        }
        return n <= 0;
    }
}

第二次

可以将 flowerbed 左右各添加一个空格,需要添加哑节点导致空间复杂度有所上升,额外开辟了 n + 2 的数组空间。
逻辑方面遍历下标从 1 开始,遍历长度最大值依旧为 length 这样下标便不会越界。

flowerbed

[0] + [1,0,0,0,1] + [0]

祝大家刷题顺利,工作合意!

你可能感兴趣的:(Leetcode#605 种花问题)