904. 水果成篮:滑动窗口+哈希表

简介: 这是 力扣上的 904. 水果成篮,难度为 中等。

题目描述

这是 力扣上的 904. 水果成篮,难度为 中等

image.png

题目分析

我们需要按照题目要求来采摘水果,看了题目描述和示例之后我们知道,我们咱们只有两个篮子,只能采摘两种类型的水果,数量没有上限,但是你以为你就可以肆无忌惮的采摘了吗?


题目要求我们可以从任意的树上开始摘,开始之后,咱们只能往右逐个树的去摘,最多两种类型,如果遇到了第三种类型,就要停止采摘了,那么问题其实就比较明确了,我们需要聚焦在,我们需要从哪棵树开始摘

思考:

对于一排树,我们需要知道从哪棵树开始采摘,我们采摘到的水果才是最大数量的,简单来说就是要找到这个期望的区间了,例如

image.png

找区间,我们可以使用滑动窗口来进行实现,咱们的窗口中,只能容纳两种类型的水果,水果数量一样也是无上限,如果超出第三种类型的水果在区间中,那么我们就要将第一种类型的水果从窗口种去掉

image.png

在窗口滑动的过程中,我们可以使用一个哈希表来记录哪些类型的水果在窗口中,key 为水果类型,value 为对应类型的水果数量

此处就要注意了,如果咱们遇到区间中有第三种类型的水果时,我们从哈希表中去除第一种类型的水果,直到这种类型的水果完全从区间去除掉才行,同时,我们需要将该种类型的 key 从 哈希表中去除掉

这样一来,我们遍历一遍 fruits 数组,每遍历一次我们就记录一下当前窗口种符合要求的水果数量,并取最大值即可

接下来,咱们就可以来实现编码了,咱们这次使用 golang 的方式来进行实现

Golang 的实现方式:

  • 定义哈希表,golang 中就是 map
  • 遍历 fruits 数组
  • 符合要求的纳入滑动窗口
  • 滑动窗口容纳不了的,就从窗口的头逐个去掉不符合要求的水果,同时去掉在 哈希表中 该中水果类型的 key
func totalFruit(fruits []int) int {
    help := make(map[int]int, 0)
    res := 0
    // 定义双指针来实现滑动窗口
    left := 0
    for right,v := range fruits {
        help[v]++
        for len(help) > 2 {
            // 此时说去 left -- right 区间已经有 3 种水果了,需要去掉第 1 种
            tmp := fruits[left]
            help[tmp]--
            if help[tmp] == 0{
                delete(help, tmp)
            }
            left++
        }
        res = max(res , right - left + 1)
    }
    return res
}
func max(a,b int) int {
    if a>b{
        return a
    }
    return b
}

这种实现方式,咱们的时间复杂度为 O(n),此处的 n 是 fruits 数组的长度,空间复杂度为 O(1),此处我们虽然开辟了 help 哈希表来进行处理,但是咱们的 help map 中最多只会有 3 个键值对,因此我们可以看做是常数级别的

今天就到这里,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关文章
|
人工智能 语音技术 Android开发
|
数据采集 C语言
单片机开发之ADC0808/9信号采集
本文主要介绍了单片机开发之ADC0808/9信号采集
783 0
单片机开发之ADC0808/9信号采集
|
机器学习/深度学习 自然语言处理 监控
命名实体识别(Named Entity Recognition, NER)
命名实体识别(Named Entity Recognition, NER)
512 7
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
|
10月前
|
缓存 Shell iOS开发
修改 torch和huggingface 缓存路径
简介:本文介绍了如何修改 PyTorch 和 Huggingface Transformers 的缓存路径。通过设置环境变量 `TORCH_HOME` 和 `HF_HOME` 或 `TRANSFORMERS_CACHE`,可以在 Windows、Linux 和 MacOS 上指定自定义缓存目录。具体步骤包括设置环境变量、编辑 shell 配置文件、移动现有缓存文件以及创建符号链接(可选)。
2955 2
|
11月前
|
供应链 网络协议 数据安全/隐私保护
|
API Python
python属性错误(AttributeError)
【7月更文挑战第13天】
1009 10
|
运维 Devops jenkins
DevOps实践之路:从自动化部署到持续交付
【7月更文挑战第16天】在当今快速迭代的软件生命周期中,DevOps已经成为提升效率、缩短产品上市时间的关键因素。本文将深入探讨DevOps的核心理念与实践,特别是如何通过自动化工具实现代码的持续集成和部署,以及如何构建有效的持续交付流程。我们将从理论出发,结合实际案例分析,为读者提供一套完整的DevOps落地方案。
|
网络协议 视频直播 网络架构
广播和组播之间的区别
【4月更文挑战第12天】
1774 1
广播和组播之间的区别