LeetCode刷题记录(四十二):种花问题

170 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

种花问题

image.png

题目解析

题目难度:简单

题目素材解析

本道题,提供了两个素材:

  1. 一个整数数组flowerbad。

  2. 一个整数n。

并且保证整数数组长度在1到10000之间,其中的元素是非1即0。并且不会有连续的1存在。

我的解读

题目比较长,通过一个种花的问题,延伸到处理数组中的空位问题。

简而言之,是要从一个只包含1和0的整数数组中,将一些1覆盖到0元素上,并且要保证不能出现连续的1。

所以我们可以通过统计连续超过三个0的个数,然后存入到一个集合中,然后再做统一的计算。

这里还有几个特殊情况,比如首尾只要存在两个0就能插入一个1,中间有三个0才能插入一个1。

还有就是全部都是0的情况,数组长度等于1的情况,都需要处理一下。

解题思路

下面我们就来一步一步的来讲述一下代码逻辑。

第一步,先来处理数组长度等于1的情况,如果元素等于0,则比对n和1的大小值,返回结果。

第二步,开始统计连续三次0出现的次数和序列数值。

第三步,开始处理全是0的情况。

第四步,开始处理最后一波为0的个数是否等于或者超过2次,因为是尾部,所以也试做加1。

第五步,开始处理头部的0是否存在连续两个0以上的情况。

第六步,开始正式转换数值,通过规律来计算出具体值。

第七步,比对和n的大小。

下面我们就来看一下代码编写情况。

代码

本次代码执行如下:

public class Solution {

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.canPlaceFlowers(new int[]{1,0,0,0,0}, 2));
        System.out.println(solution.canPlaceFlowers(new int[]{0,0}, 2));
    }

    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        if(flowerbed.length == 1){
            if(flowerbed[0] == 0){
                return n <= 1;
            }else{
                return n <= 0;
            }
        }
        List<Integer> kongweiList = new ArrayList<>();
        int kongweiCount = 0;
        for (int j : flowerbed) {
            if (j == 0) {
                kongweiCount++;
            } else if (kongweiCount >= 3) {
                kongweiList.add(kongweiCount);
                kongweiCount = 0;
            } else {
                kongweiCount = 0;
            }
        }

        int r = 0;
        //全是0的情况
        if(kongweiCount == flowerbed.length){
            return flowerbed.length / 2 >= n;
        }
        //首尾是否存在0的情况
        if(kongweiCount >= 2){
            kongweiList.add(++kongweiCount);
        }
        if(flowerbed.length >= 3 && flowerbed[0] == 0 && flowerbed[1] == 0){
            r++;
        }
        for (Integer k : kongweiList){
            r = r + (k - 1) / 2;
        }
        return r >= n;
    }

}

执行结果

这次的执行结果就很一般了,内存消耗太严重,没有找出关键的规律,只是在处理各种情况导致的。

image.png

欢迎加入专栏,一起来刷题。