当前位置: 首页 > news >正文

[优选算法专题二滑动窗口——水果成篮]

题目链接

904. 水果成篮 - 力扣(LeetCode)

题目描述

题目解析

问题深入理解

题解思路

首先分析一下题目的意思:

你拥有两个篮子,每个篮子可以放一种水果
我们需要以某一棵树为起点,连续摘下每棵树的果子,要求尽可能摘多的果子,注意:题目要求必须连续采摘
当我们遇到第三种水果时,摘果结束
eg: [0,1,2,2]
一共有三种水果,分别是:0,1,2号水果
当我们从下标为0 的地方开始采摘,那么可以采摘【0,1】,一共可以采摘两个水果
当我们从下标为1 的地方开始采摘,那么可以采摘【1,2,2】,一共可以采摘三个水果

问题本质

"水果成篮" 问题本质上是一个滑动窗口经典应用,可以抽象为:

在一个数组中,寻找最长的连续子数组,该子数组最多最多包含两种不同元素。

这属于 "最多包含 k 种元素的最长子数组" 问题的特例(k=2)。

算法原理:滑动窗口(Sliding Window)

核心思想

滑动窗口是一种在数组或链表上高效遍历子序列的技术,通过维护一个 "窗口"(由左右两个指针界定的连续区间),动态调整窗口大小来寻找满足条件的解。

对于本问题:

  • 窗口需要满足的条件:最多包含 2 种水果类型
  • 优化目标:窗口的长度尽可能大
  • 算法工作原理
  • 初始化窗口:左右指针leftright都从 0 开始,形成一个初始窗口[0,0]
  • 扩展窗口:向右移动right指针,将新元素纳入窗口
  • 维护窗口合法性:当窗口中元素类型超过 2 种时,向右移动left指针,直到窗口重新满足条件
  • 记录最优解:每次调整后计算当前窗口长度,更新最大长度

    这个过程就像一个滑动的窗口在数组上移动,不断扩大右边界,必要时收缩左边界,始终保持窗口的合法性,同时追踪最大窗口长度。

如下图

完整代码

算法特性分析

  1. 时间复杂度:O(n)

    • 每个元素最多被leftright指针各访问一次
    • 哈希表的操作(插入、删除、查找)都是 O (1)
  2. 空间复杂度:O(1)

    • 哈希表最多存储 3 种水果类型(调整窗口时可能短暂出现 3 种)
    • 额外变量仅占用常数空间
http://www.lryc.cn/news/624726.html

相关文章:

  • PyTorch数据处理工具箱(数据处理工具箱概述)
  • 【JavaEE】(16) Spring Boot 日志
  • C语言关于函数传参和返回值的一些想法
  • 《亚矩阵云手机重构出租接单:KVM 虚拟化与边缘计算驱动的设备替代技术路径》
  • Highcharts for Flutter 正式发布
  • SQL语法大全指南
  • 【Day 29 】Linux-数据库
  • 设计模式(四)——责任链模式
  • 福彩双色球第2025095期篮球号码分析
  • 19.8 《3步实现OPT-6.7B无损量化:用自定义数据集省70%显存,精度仅跌2.3%》
  • 终极方案!lightRag/graphRag离线使用tiktoken持续报错SSLError,不改源码,彻底解决!
  • 海洋牧场邂逅海洋旅游:碰撞出新业态的璀璨火花
  • 北斗安心联车辆管理系统优势分析
  • 飞机起落架轮轴深孔中间段电解扩孔内轮廓检测 - 激光频率梳 3D 轮廓检测
  • Conda技巧:修改Conda环境目录,节省系统盘空间
  • 【每天学点‘音视频’】前向纠错 和 漏包重传
  • vue从入门到精通:搭建第一个vue项目
  • 表格内容对比及标记
  • PLC无线组网实现多台RGV搬运机器人输送系统通讯案例
  • SSM从入门到实战:1.4 Spring Bean的生命周期管理
  • 【STM32】STM32H750 CubeMX 配置 USB CDC 虚拟串口笔记
  • ThinkPHP的安装运行和调试
  • MCP协议演进:从SSE到Streamable HTTP的技术革命
  • SAP ABAP IS SUPPLIED
  • 【语法糖】什么是语法糖
  • Java+Vue构建资产设备管理系统,适配移动端与后台管理,实现全生命周期管理,涵盖采购、入库、使用、维护、报废等环节,提供完整源码,便于二次开发
  • 快速搭建项目(若依)
  • CentOS 7 LAMP快速部署WordPress指南
  • linux中的hostpath卷、nfs卷以及静态持久卷的区别
  • python+flask后端开发~项目实战 | 博客问答项目--数据库信息的基本配置与UserModel的创建,映射,关联