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

LeetCode - 904. 水果成篮

题目

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

思路

题目本质

你有一个整数数组,每个元素代表一种水果。你只能用两个篮子,每个篮子只能装一种水果。你要在数组中找一个最长的连续子数组,这个子数组里最多只包含两种不同的数字(水果种类)。

解题思路(滑动窗口法)

滑动窗口:

用两个指针(left和right)表示当前连续子数组的左右边界。right每次向右扩展,left根据需要向右收缩。

统计水果种类:

用一个哈希表(如unordered_map)记录当前窗口内每种水果的数量。

窗口合法性:

  • 如果窗口内水果种类不超过2种,窗口合法,更新最大长度。
  • 如果超过2种,移动left指针,直到窗口内只剩下2种水果。

更新答案:

每次窗口合法时,更新最大长度。

过程

以 [1,2,1,2,3] 为例:

  • 初始窗口 [1],种类1种。
  • 扩展到 [1,2],种类2种。
  • 扩展到 [1,2,1],种类2种。
  • 扩展到 [1,2,1,2],种类2种。
  • 扩展到 [1,2,1,2,3],种类3种,不合法。此时需要移动left,直到只剩2种水果。

读者可能出现的错误写法

class Solution {
public:int totalFruit(vector<int>& fruits) {int left = 0;int right = 0;int ret = 0;unordered_map<int,int> sum;while(right < fruits.size()){sum[fruits[right]]++;while(sum.size() > 2){sum[fruits[left]]--;}ret = max(ret,right-left+1);right++;}return ret;}
};

代码主要问题在于:

当sum.size() > 2时,你只减少了sum[fruits[left]]--,但是没有移动left指针,

也没有在sum[fruits[left]]为0时将其从map中删除。这样会导致死循环或统计错误。

正确写法

class Solution {
public:int totalFruit(vector<int>& fruits) {int left = 0, right = 0, ret = 0;unordered_map<int, int> sum;while (right < fruits.size()) {sum[fruits[right]]++;while (sum.size() > 2) {sum[fruits[left]]--;if (sum[fruits[left]] == 0) {sum.erase(fruits[left]);}left++;}ret = max(ret, right - left + 1);right++;}return ret;}
};
http://www.xdnf.cn/news/1024921.html

相关文章:

  • MATLAB | 如何使用MATLAB获取《Nature》全部绘图 (附23-25年图像)
  • 功能测试—软件的生命周期
  • 内存泄漏排查
  • 新手前端开发常见问题之层级问题
  • 洛谷:B4163 [BCSP-X 2024 12 月初中组] 序列选择
  • 《棒垒球百科》棒球、垒球奥运会运动员规定·棒球1号位
  • 前端项目Excel数据导出同时出现中英文表头错乱情况解决方案。
  • 【Python办公】使用pandas批量读取csv保存为Excel
  • 上传视频报错 413 Request Entity Too Large
  • 《Transformer 的奇妙图书馆:一场关于注意力的冒险》
  • Zemax光学设计自学
  • 泰国跨境电商系统开发:多语言多币种 + 国际物流对接,中泰贸易桥梁
  • 用电子垃圾DIY一个可调小电源(5-12V)
  • 69、JS中如何调用上位机接口
  • 苹果WWDC 2025 技术趋势分析
  • SAP生产订单技术性完成(TECO)操作指南与实战应用
  • 写作中的贪念
  • [MSPM0开发]之七 MSPM0G3507 UART串口收发、printf重定向,循环缓冲解析自定义协议等
  • 前端八股文-react篇
  • Ubuntu 与 Windows 实现文件夹共享
  • 前缀和:leetcode974--和可被K整除的子数组
  • 序列化问题和网络字节序
  • 商城系统微服务化改造:三大难点与实战解决方案
  • P5 QT项目----会学网络调试助手服务端(5.1)
  • 一文读懂:晶振不同等级的差异及对应最佳应用场景
  • 关于 WASM: WASM + JS 混合逆向流程
  • ffmpeg rtmp推流源码分析
  • Java的学习心得
  • 大型螺旋桨三维扫描尺寸检测逆向建模-中科米堆
  • 为什么传统 Bug 追踪系统正在被抛弃?