904. 水果成篮(滑动窗口)模板题
在一排樹中,第 i 棵樹產生 tree[i] 型的水果。
你可以從你選擇的任何樹開始,然后重復執行以下步驟:
1,把這棵樹上的水果放進你的籃子里。如果你做不到,就停下來。
2,移動到當前樹右側的下一棵樹。如果右邊沒有樹,就停下來。
請注意,在選擇一顆樹后,你沒有任何選擇:你必須執行步驟 1,然后執行步驟 2,然后返回步驟 1,然后執行步驟 2,依此類推,直至停止。
你有兩個籃子,每個籃子可以攜帶任何數量的水果,但你希望每個籃子只攜帶一種類型的水果。
用這個程序你能收集的水果樹的最大總量是多少?
——————————————————————————————————————————————————————
示例 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
這個題目有點不好懂,直接簡化一下,題目意思就是求只包含兩種元素的最長連續子序列,這樣就好理解了;
這個題目其實就是滑動窗口的應用,
滑動窗口就是不斷的調節子序列的起始位置和終止位置,從而得出我們要想的結果。
其實可以說滑動窗口就是雙指針的一種,但是操作起來像一個窗口在移動,所以就叫滑動窗口;
滑動窗口有很多模板,像這道題目的模板很簡單:
求最長子數組長度
這個模板很常見,也是通用性很高的,可以記住;
這個題目其實可以用哈希表來做籃子basket,記錄不同果樹的水果數量,操作起來也更簡單
代碼有詳細注釋,代碼如下:
class Solution { public:int totalFruit(vector<int>& fruits) {//定義一個哈希表作為籃子,記錄每種類型水果的個數unordered_map<int, int> basket;//begin是窗口左邊界int begin = 0, ans = 0;//end是窗口右邊界,遍歷所有果樹for (int end = 0; end < fruits.size(); ++end) {//記錄每種水果個數basket[fruits[end]]++;//如果當前籃子已經有兩種以上水果,則不符合題意,需要減去一種水果while (basket.size() > 2) {//將窗口左邊界(即第一種水果)逐漸向右移basket[fruits[begin]]--;//當第一種水果已經刪除完了,這時就把這種水果從籃子里移除//讓籃子里只有兩種水果if (basket[fruits[begin]] == 0) basket.erase(fruits[begin]);//窗口左邊界不斷右移更新begin++;}//取最大的情況ans = max(ans, end - begin + 1);}return ans;} }; 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的904. 水果成篮(滑动窗口)模板题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 59. 螺旋矩阵 II(模拟)
- 下一篇: 76. 最小覆盖子串(滑动窗口)