LeetCode 239. 滑动窗口最大值(双端队列+单调栈)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 239. 滑动窗口最大值(双端队列+单调栈)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目信息
- 2. 解題
- 2.1 暴力法
- 2.2 雙端隊列法
1. 題目信息
給定一個數組 nums,有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。
返回滑動窗口中的最大值。
示例:輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 輸出: [3,3,5,5,6,7] 解釋: 滑動窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7 51 3 -1 [-3 5 3] 6 7 51 3 -1 -3 [5 3 6] 7 61 3 -1 -3 5 [3 6 7] 7提示:
你可以假設 k 總是有效的,在輸入數組不為空的情況下,1 ≤ k ≤ 輸入數組的大小。
進階:
你能在線性時間復雜度內解決此題嗎?
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/sliding-window-maximum
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
2.1 暴力法
雙重循環查找,O(nk)復雜度
2.2 雙端隊列法
將雙端隊列看做棧,單調遞減棧法。
- 在雙端隊列里保存下標
- 隊首保存最大的,隊尾保存小的
- 但是注意規則:
對 {1,3,-1,-3,5,3,6,7},k = 3
先建立前k個元素的隊列:{1},{1,3},{1,3,-1}(隊列變化過程)(為了方便我用元素值表示)
對后面n-k個元素分別操作:
{3,-1,-3}
{-1,-3, 5}
{-3, 5,3}
{5,3,,6}
{3,6,7}
每次取出隊首就是答案。3,3,5,5,6,7
每個元素進出隊列,時間復雜度O(n)
《劍指Offer》面試題59 - I. 滑動窗口的最大值
class Solution { //2020.2.21 public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {if(nums.empty())return {};int l = 1, r = 0;vector<int> ans;deque<int> q;while(k--){while(!q.empty() && nums[q.back()] <= nums[r]){q.pop_back();}q.push_back(r++);}ans.push_back(nums[q.front()]);while(r < nums.size()){if(q.front() < l)q.pop_front();while(!q.empty() && nums[q.back()] <= nums[r]){q.pop_back();}q.push_back(r++);l++;ans.push_back(nums[q.front()]);}return ans;} };總結
以上是生活随笔為你收集整理的LeetCode 239. 滑动窗口最大值(双端队列+单调栈)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中接口测试垃圾数据如何清理_
- 下一篇: 武林c语言,详解C语言中条件编译