239 最大滑動視窗

2021-09-10 02:09:11 字數 1492 閱讀 5735

滑動視窗當中的最大值

掃瞄正個陣列,o(n), 每個節點處需要進行掃瞄k個節點,所有時間複雜度為o(nk),

class

solution

return result;

}private

void

helper

(int

nums,

int start,

int end,

int[

] result,

int i)

result[i]

= max;

}}

時間複雜度為o(nlog(k)), 同樣需要遍歷整個元素的基本情況,只不過需要降低每次, 使用有序sortmap 實現 。 採用紅黑樹的排序演算法,對k 個元素找出最大值的情況

treemap 預設排序規則:按照key的字典順序來排序(公升序) 按照key 進行排序, 的基本情況, 不需要把所有的元素都情況, 像我們上一道題目的做法其實就是採用了o(k)的思路,將視窗k當中的元素全部清空, 導致在這時間複雜度為o(k),導致時間複雜度為o(k), 所以思路主要是在這裡面考慮如何將o(k),時間複雜降低為o(log(k)) 問題, 如何改為這種形式 ,

紅黑樹當中的排序時間複雜度為log(k),

利用隊頭存放有可能成為視窗最大值的元素,

每次往結果上面新增都是新增對頭的元素(肯定是這樣的情況)

每次處理乙個元素都需要新增一次的基本情況 隊頭

隊尾巴while(清空不滿足題意的題目情況)

新增元素情況

j-k+1 到 k 這是雙向佇列當中元素的範圍,當對頭和對尾元素下標範圍超過這個值,那麼就不是在乙個滑動視窗內,就要刪除對頭元素

**

public

int[

]maxslidingwindow

(int

a,int k)

int n = a.length;

int[

] r =

newint

[n-k+1]

;int ri =0;

// store index

deque

q =newarraydeque

<

>()

;for

(int i =

0; i < a.length; i++

)// remove smaller numbers in k range as they are useless

while

(!q.

isempty()

&& a[q.

peeklast()

]< a[i]

)// q contains index... r contains content

q.offer

(i);

if(i >= k -1)

}return r;

}

直接看這篇部落格

這道題目也可以

leetcode 滑動視窗最大 (239)

給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。返回滑動視窗中的最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大...

239 滑動視窗最大值

給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。返回滑動視窗中的最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大...

239 滑動視窗最大值

239.滑動視窗最大值 solution deque solution maxindex 暴力法的時間複雜度為 o n k 弊端為每次掃瞄視窗的最大值,每兩次掃瞄之間都會存在重複的值比較,已經知道了他們的最大值是誰了,所以要減少比較次數 為什麼新增的是索引 將i加到隊尾 deque.addlast ...