- 题目:给定一个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;
}
}