滑動視窗當中的最大值
掃瞄正個陣列,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 ...