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


theme: smartblue

持续创作,加速成长!这是我参与「掘金日新计划 · 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的大小。

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

代码

本次代码执行如下:

```java 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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ijiran

一杯咖啡太贵,一块糖就可以

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值