前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 904. 水果成篮(滑动窗口)

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

作者头像
Michael阿明
发布2020-07-13 15:22:04
1.2K0
发布2020-07-13 15:22:04
举报

1. 题目

在一排树中,第 i 棵树产生 tree[i] 型的水果。 你可以从你选择的任何树开始,然后重复执行以下步骤:

  • 把这棵树上的水果放进你的篮子里。如果你做不到,就停下来。
  • 移动到当前树右侧的下一棵树。如果右边没有树,就停下来。

请注意,在选择一颗树后,你没有任何选择:你必须执行步骤 1,然后执行步骤 2,然后返回步骤 1,然后执行步骤 2,依此类推,直至停止。

你有两个篮子,每个篮子可以携带任何数量的水果,但你希望每个篮子只携带一种类型的水果。 用这个程序你能收集的水果总量是多少?

代码语言:javascript
复制
示例 1:
输入:[1,2,1]
输出:3
解释:我们可以收集 [1,2,1]。

示例 2:
输入:[0,1,2,2]
输出:3
解释:我们可以收集 [1,2,2].
如果我们从第一棵树开始,我们将只能收集到 [0, 1]。

示例 3:
输入:[1,2,3,2,2]
输出:4
解释:我们可以收集 [2,3,2,2].
如果我们从第一棵树开始,我们将只能收集到 [1, 2]。

示例 4:
输入:[3,3,3,1,2,1,1,2,3,3,4]
输出:5
解释:我们可以收集 [1,2,1,1,2].
如果我们从第一棵树或第八棵树开始,我们将只能收集到 4 个水果。
 
提示:
1 <= tree.length <= 40000
0 <= tree[i] < tree.length

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/fruit-into-baskets 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 滑动窗口,窗口内的水果种类数最多2种
  • 窗口右端点一直向右扩大,左端点在水果种类 > 2种时,向右移动
代码语言:javascript
复制
class Solution {
public:
    int totalFruit(vector<int>& tree) {
    	unordered_map<int,int> m;
    	int i = 0, j = 0, n = tree.size(), maxf = 0;
    	while(j < n)
    	{
    		if(m.size() > 2)//水果大于2种
    		{
    			m[tree[i]]--;//左端丢弃
    			if(m[tree[i]]==0)
    				m.erase(tree[i]);//计数为0,删除
    			i++;
    		}
    		m[tree[j]]++;//右端点加入
            if(m.size() <= 2)
                maxf = max(maxf, j-i+1);
    		j++;
    	}
    	return maxf;
    }
};

360 ms 57.4 MB

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档