又回到最初的起点,这是我做的第一道题,当时提交了44次,而且还是暴力解。但是已经知道用双端队列的方式来解。
新年快乐~
暴力解
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int max[] = new int[0];
int start = 0;
int temp[] = new int[0];
int test = 0;
//讨论分析输入的情况,分类
if( k <= 1) {
temp = new int [1];
max = new int [nums.length];
} else if ( k > 1 && nums.length >= 2){
temp = new int [k - 1];
max = new int[nums.length + 1 - k];
}
if(k <= nums.length ){
if( k == 1 ){
for(int i = 0; i < nums.length; i++){
max[i] = nums[i];
}
return max;
}
for( int i = 0; i < max.length; i++){
start = i;
for(int j = 0; j < k - 1; j++){
temp[j] = nums[start] > nums [start + 1] ? nums[start] : nums[start + 1];
start++;
}
//第一种方法:Arrays.sort
//Arrays.sort(temp);
//max[i] = temp[temp.length - 1];
//第二种方法:AArrays.stream(arr).max().getAsInt()
max[i] = Arrays.stream(temp).max().getAsInt();
//第三种方法
//max[i] = test;
}
return max;
} else {
System.out.println("窗长设置有误~");
return max;
}
}
}
单调队列
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
Deque<Integer> deque = new ArrayDeque<>();
int n = nums.length;
if(n - k + 1 <= 0)
return new int[0];
if(k == 1)
return nums;
int[] res = new int[n - k + 1];
for(int i = 0; i < n; i++){
while(!deque.isEmpty() && nums[deque.peekLast()] < nums[i])
deque.pollLast();
deque.offerLast(i);
while(!deque.isEmpty() && deque.peekFirst() < i-k+1)
deque.pollFirst();
if(i-k+1 >= 0)res[i-k+1] = nums[deque.peekFirst()];
}
return res;
}
}