每日一題 佇列系列 1 滑動視窗最大值

2021-10-21 13:52:00 字數 1611 閱讀 2346

給你乙個整數陣列 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...