文章目錄
- 題目描述
- 思路 && 代碼
- 1. 暴力法 O(n2n^2n2) && O(1)
- 2. 單調(diào)隊列輔助 O(n) && O(n)
- 二刷
打卡第十天~
題目描述
思路 && 代碼
1. 暴力法 O(n2n^2n2) && O(1)
- 老規(guī)矩,先來個暴力法熟悉一下題目~
- 出乎意料沒有超時…不過我們還是需要尋找更優(yōu)的做法!
class Solution {public int[] maxSlidingWindow(int[] nums
, int k
) {if(nums
.length
== 0) {return new int[]{};}int[] res
= new int[nums
.length
- k
+ 1];for(int i
= 0; i
< res
.length
; i
++) {int max
= nums
[i
];for(int j
= 0; j
< k
; j
++) {max
= Math.max(max
, nums
[i
+ j
]);}res
[i
] = max
; } return res
;}
}
2. 單調(diào)隊列輔助 O(n) && O(n)
- 空間換時間!
- 利用一個單調(diào)遞減的隊列,始終把當(dāng)前滑動窗口最大值置于隊頭
- 更新判斷一:當(dāng)前隊頭是否已經(jīng)脫離滑動窗口。(我覺得這塊具體代碼不太好想到)
- 更新判斷二:加入當(dāng)前數(shù)組元素,是否會改變隊列遞減特性
class Solution {public int[] maxSlidingWindow(int[] nums
, int k
) {if(nums
.length
== 0) {return new int[]{};}Deque<Integer> deque
= new LinkedList<>();int[] res
= new int[nums
.length
- k
+ 1];for(int i
= 0, windowTail
= 1 - k
; i
< nums
.length
; i
++, windowTail
++) {if(windowTail
> 0 && deque
.peekFirst() == nums
[windowTail
- 1]) {deque
.removeFirst();}while(!deque
.isEmpty() && deque
.peekLast() < nums
[i
]) {deque
.removeLast();}deque
.addLast(nums
[i
]);if(windowTail
>= 0) {res
[windowTail
] = deque
.peekFirst();}}return res
;}
}
二刷
- 單調(diào)隊列,找最大值,則需要單調(diào)減(隊頭為最大)
class Solution {public int[] maxSlidingWindow(int[] nums
, int k
) {if(nums
.length
== 0) {return new int[]{};}int[] ans
= new int[nums
.length
- k
+ 1];Deque<Integer> queue
= new ArrayDeque<>();for(int i
= 0, windowTail
= 1 - k
; i
< nums
.length
; i
++, windowTail
++) {if(windowTail
> 0 && queue
.element() == nums
[windowTail
- 1]) {queue
.poll();}while(!queue
.isEmpty() && nums
[i
] > queue
.getLast()) {queue
.removeLast();}queue
.offer(nums
[i
]);if(windowTail
>= 0) {ans
[windowTail
] = queue
.element();}}return ans
;}
}
總結(jié)
以上是生活随笔為你收集整理的【LeetCode笔记】剑指Offer 59. I 滑动窗口的最大值(Java、单调队列)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。