滑动窗口系列-Leetcode 904. 水果成蓝【非 常见的 的滑动窗口】

问题描述

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

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

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

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

示例 1:

输入:[1,2,1]
输出:3
解释:我们可以收集 [1,2,1]。

解题报告

使用集合 s 来存储篮子里的水果类型。

  • 移动右指针时,往集合中插入元素;
  • 当集合中的元素个数大于2时,更新左指针【注意此处是更新左指针,而不是左指针右移】;
  • 将左指针指向右指针的前一个元素,查找第一个与当前 tree[l] 不同的元素的下标,将其从集合中删除;
  • 更新答案,右指针右移一位。

注意:
while(tree[l]==tree[l-1]) 此处不需要加条件 l>0,因为在集合中的元素大于 2 的时候才开始执行查找,查找结束 l 必然是大于 1 的。

实现代码

class Solution{
    public:
        int totalFruit(vector<int>&tree){
            set<int>s;
            int ans=0,l=0,r=0;
            while(r<tree.size()){
                s.insert(tree[r]);
                if(s.size()>2){
                    l=r-1;
                    while(tree[l]==tree[l-1])l--;
                    s.erase(tree[l-1]);
                }
                ans=max(ans,r-l+1);
                r++;
            }
            return ans;
        }
};

参考文献

[1] Leetcode 904. 水果成蓝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章