LeetCode#239. Sliding Window Maximum
阿新 • • 發佈:2019-02-03
- 題目:給定一個int陣列nums和一個滑動視窗值k,返回每個滑動子視窗的最大元素組成的陣列(滑動子視窗是nums的連續子串,包括k個元素)
- 難度:Hard(如果對時間複雜度沒有要求,難度並不大)
- 思路:暴力解法-兩層for迴圈分別求出每一個子視窗的最大元素
- 程式碼:
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums == null || nums.length == 0 || k <= 0|| nums.length < k){
return nums;
}
int len = nums.length-k+1;
int[] result = new int[len];
for(int i = 0; i< nums.length-k+1; i++){
int max = nums[i];
for(int j = 0; j < k; j++){
if(nums[i+j] > max){
max = nums[i+j];
}
}
result[i] = max ;
}
return result;
}
}
方法二:利用雙向佇列維護子視窗中最大元素
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || k <= 0) {
return new int[0];
}
int len = nums.length;
int[] result = new int[len-k+1];
int index = 0;
LinkedList<Integer> queue = new LinkedList<Integer>();
for(int i = 0; i < len; i++){
//如果第i個元素大於佇列最後一個下標在陣列中的值,就把佇列最後一個pop掉
while(!queue.isEmpty() && nums[queue.peekLast()] < nums[i]){
queue.pollLast();
}
//已經過期的隊頭元素,pop掉
while(!queue.isEmpty() && queue.peek() < i-k+1){
queue.poll();
}
queue.offer(i);
if(i >= k-1){
result[index++] = nums[queue.peek()];
}
}
return result;
}
}