求滑动窗口中的最大值和最小值
生活随笔
收集整理的這篇文章主要介紹了
求滑动窗口中的最大值和最小值
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
滑動窗口: 一般使用雙指針算法,左指針l和右指針r之間的空間稱為窗口,由于指針是不斷移動的,從而窗口也可以移動,稱為滑動窗口。
?
滑動窗口的最值: 由于窗口是移動的,移動的過程中有新元素的加入也有舊元素的彈出。每一次元素的加入或彈出都可能使窗口中元素的最值發生變化,也正是會發生變化,使得無法直接獲取任意時刻滑動窗口的最值。
?
單調隊列求滑動窗口最值: 雖然滑動窗口中不斷有新元素加入和舊元素彈出,但是始終都有一個特點就是新元素都是從右指針r處加入的,舊元素都是從左指針l處彈出的。當一個元素如果是當前窗口的最大值,則它前面的值就不需要保存,因為只要它在窗口中,最值就不會變成其他的值,而對于它后面的比它小的元素則要保存,因為它一點彈出,最大值就要發生變化,需要保存后面的比它小的值。類似可推最小值。
?
雙端隊列: 使用雙端隊列,維持隊列是一個單調隊列(最大值: 單調遞增隊列,最小值: 單調遞減隊列),每次最值就是雙端隊列的front
?
// LeetCode 1438. 絕對差不超過限制的最長連續子數組deque<int> maxx; deque<int> minn;while(r < sz){while (!maxx.empty() && nums[r] > maxx.back()) maxx.pop_back();while (!minn.empty() && nums[r] < minn.back()) minn.pop_back();maxx.push_back(nums[r]);minn.push_back(nums[r]);while(l < r && abs(maxx.front() - minn.front()) > limit){if (nums[l] == maxx.front()) maxx.pop_front();if (nums[l] == minn.front()) minn.pop_front();l ++;}if (abs(maxx.front() - minn.front()) <= limit){ans = max(ans, r - l + 1);}++r; }?
?
總結
以上是生活随笔為你收集整理的求滑动窗口中的最大值和最小值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度:年收入超百亿元的恒源祥已成中老年服
- 下一篇: Page Cache 与 Kafka 那