滑動窗口系列-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. 水果成藍

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