904. 水果成篮(数组、滑动窗口)

考察点:

数组、滑动窗口

  1. 水果成篮

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。

你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:

你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。

给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。

示例 1:

输入:fruits = [1,2,1]
输出:3
解释:可以采摘全部 3 棵树。

示例 2:

输入:fruits = [0,1,2,2]
输出:3
解释:可以采摘 [1,2,2] 这三棵树。
如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。

示例 3:

输入:fruits = [1,2,3,2,2]
输出:4
解释:可以采摘 [2,3,2,2] 这四棵树。
如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。

示例 4:

输入:fruits = [3,3,3,1,2,1,1,2,3,3,4]
输出:5
解释:可以采摘 [1,2,1,1,2] 这五棵树。

提示:

1 <= fruits.length <= 105
0 <= fruits[i] < fruits.length

题解(滑动窗口):

class Solution {public int totalFruit(int[] fruits) {int left = 0, right = 0, kind = 0, ans = 0;int[] count = new int[fruits.length];for (; right < fruits.length; ++right) {++count[fruits[right]];if (count[fruits[right]] == 1) {++kind;}while (kind > 2) {count[fruits[left]]--;if (count[fruits[left]] == 0) {--kind;}++left;}ans = Integer.max(ans, right - left + 1);}return ans;}
}

解析:

  1. left为窗口左端,right为窗口右端,kind为水果种类,ans为窗口长度也就是水果数目,数组count记录每种水果已采摘的数量(用于和种类关联,数量为1则种类数加一,数量为0则种类数减一)
  2. 右端指针right为循环体遍历整个数组,左端指针left用于窗口滑动。滑动到满足题给最优结果(采集到的种类数不超过2的最大水果数量)
  3. 根据题意取最大或最小值时一定是满足题给条件下(种类kind<=2)时取的。所以这里取最小值时在滑动窗口循环后取的(跳出了循环,说明此时kind<=2)。
  4. --------》再次强调,在满足题给条件下取最值,如:也有在滑动窗口循环内取最值的,参考:209. 长度最小的子数组

904. 水果成篮(数组、滑动窗口)相关推荐

  1. 904. 水果成篮(滑动窗口)模板题

    在一排树中,第 i 棵树产生 tree[i] 型的水果. 你可以从你选择的任何树开始,然后重复执行以下步骤: 1,把这棵树上的水果放进你的篮子里.如果你做不到,就停下来. 2,移动到当前树右侧的下一棵 ...

  2. leetcode 904:水果成篮(滑动窗口)

    一:题目 二:思路 1.用两个篮子装进两个数,后面只能装入这两个相同的数,并统计个数;如果遇到其他数,则重新开始计数, 这里的重新开始计数指的是在去除第一个篮子中所装进的数 2.滑动窗口来做 滑动窗口 ...

  3. LeetCode 904. 水果成篮(滑动窗口)

    1. 题目 在一排树中,第 i 棵树产生 tree[i] 型的水果. 你可以从你选择的任何树开始,然后重复执行以下步骤: 把这棵树上的水果放进你的篮子里.如果你做不到,就停下来. 移动到当前树右侧的下 ...

  4. Leetcode 904.水果成蓝(滑动窗口,哈希容器map

    传送门:力扣 你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 . 你想要尽可能多地收集水果.然而,农场 ...

  5. 【042】904. 水果成篮[滑动窗口]

    你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 . 你想要尽可能多地收集水果.然而,农场的主人设定了一 ...

  6. C++:Leetcode-滑动窗口-904.水果成篮

    C++:Leetcode-滑动窗口-904水果成篮 重点掌握滑动窗口思想,左指针和右指针分别代表的含义 重点掌握熟悉利用哈希表进行统计和查重. 面对这种同类型数量统计问题或者是查重问题,哈希表是不二之 ...

  7. LeetCode 904. 水果成篮

    904. 水果成篮 题目:你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 . 你想要尽可能多地收集水果 ...

  8. LeetCode每日一题——904. 水果成篮

    LeetCode每日一题系列 题目:904. 水果成篮 难度:普通 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整 ...

  9. leetcode 题解 904.水果成篮(Typescript)

    /* * @lc app=leetcode.cn id=904 lang=typescript * * [904] 水果成篮(实质为求最大两元素连续子串) */ //滑动窗口 // @lc code= ...

最新文章

  1. Linux实用命令集
  2. python multi_python – 堆叠MultiIndex的所有级别
  3. TCP/IP协议-概念、应用、开发、Hack
  4. C++中使用流读取数据 ifstream
  5. sql去重常用的基本方法
  6. Documentation目录下的as-iosched.txt文档翻译
  7. Tricks(二十九)—— 2^10000 的位数
  8. Android 轻松实现语音识别详解及实例代码
  9. bzoj 2705: [SDOI2012]Longge的问题(欧拉函数)
  10. git与gitk查看某个文件的历史提交记录
  11. AngularJS scope 作用域的问题
  12. 哈希加密之高级加密自定义Key的用法(Python3.X)
  13. zoom 更改安装位置_如何以Zoom更改会议主持人
  14. 微信公众号开发框架 For Java —— wechatapi
  15. Python requests模块高级用法
  16. The Sandbox 市场平台将上线 Isla Obscura 第五期 NFT 作品集
  17. Git 的常规分支使用【dev和master】
  18. 寻找网易邮箱人工客服
  19. FineReport构建银行金融租赁考核系统
  20. 芋道源码的周八(2018.04.08)

热门文章

  1. MUI前端代码生成快捷键
  2. simulink仿真之比较产生阶梯波
  3. yolov5 nms 源码理解
  4. 基于深度学习的表面缺陷检测方法综述-论文阅读笔记
  5. NS3的半实物仿真实验 tap-wifi-dumbbell
  6. pages文件夹 AddCartSuccess Center Detail Home Login Pay PaySuccess
  7. R3.6.3下载 Rstudio下载及安装,网盘链接永久有效
  8. Java用于取得当前日期相对应的月初,月末,季初,季末,年初,年末时间
  9. Java面向可复用性和可维护性的设计模式
  10. Java 不允许在一个范围大的作用域下重新定义同名变量