給你乙個整數陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。返回滑動視窗中的最大值。
示例 1:
輸入: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 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
示例 2:
輸入:nums = [1], k = 1
輸出:[1]
示例 3:
輸入:nums = [1,-1], k = 1
輸出:[1,-1]
1
<= nums.length <=
10e5
-10e4
<= nums[i]
<=
10e4
1<= k <= nums.length
這種方法思路比較簡單、直接:從左向右依次滑動視窗的過程中,計算每一次的最大值,存入ans中。
class
solution
ans.
push_back
(max);}
return ans;}}
;
這種方法時間複雜度o(nk),會超出時間限制,因此需要進行一些優化!
對於本題,兩個相鄰(只差了乙個位置)的滑動視窗,它們共用著 k-1 個元素,而只有 1個元素是變化的,我們可以根據這個特點進行優化。
優先佇列priority_queue與普通佇列queue的不同之處在於,它包含的最大值元素位於隊首,因此這是一種非常合適解決此類問題的資料結構。
c++中,優先佇列priority_queue類的具體用法可參見:【c++養成計畫】佇列 —— 快速上手stl queue類(day13)
對於本題而言,具體步驟是:
class
solution
vector<
int> ans =
;for
(int i = k; i < n;
++i)
// 剩下的裡面最大值即可
ans.
push_back
(q.top()
.first);}
return ans;}}
;
複雜度分析:
注:這裡所有的空間複雜度分析都不考慮返回的答案需要的 o(n) 空間,只計算額外的空間使用。
每日一題 滑動視窗
題目要求 給定乙個陣列和視窗大小,視窗從左向右依次滑動,判斷視窗中最大的值是多少,返回乙個陣列 例如 給定陣列 視窗大小2,返回 暴力破解 author 鄭濤 public int windosmax int arr,int size if arr.length 1 size 1 int res n...
每日一題 239 滑動視窗最大值
最開始的想法是維護乙個list,每次滑動移除nums left 加入nums right 並對list進行重新排序,取出最大的值即可,但是最後超時 學習之後決定使用雙端佇列 總體的基本思想就是維護住乙個依次遞減的雙端佇列 總結為 以下幾點 1.隊首元素是當前的最大元素,如果新元素小於隊尾元素,那麼就...
每日一題 480 滑動視窗中位數
因為要尋找的是中位數,無非就是佇列中的第k個或 第k個加k 1個 2 維護乙個用於查詢中間值的佇列即可 唯一一點我不知道怎麼把ans直接轉成double的陣列 public double medianslidingwindow int nums,int k while rightelse right...