给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
JAVA(暴力数组超时):
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n=nums.length;
int[] res;
if(n<=k){
Arrays.sort(nums);
res=new int[1];
res[0]=nums[n-1];
return res;
}else{
res=new int[n-k+1];
for(int i=0;i<n-k+1;i++){
int j=0,o=i;
int[] mid=new int[k];//中间值
while(j<k){
mid[j]=nums[o];
j++;
o++;
}
Arrays.sort(mid);
res[i]=mid[mid.length-1];
}
return res;
}
}
}
JAVA(暴力链表超时):
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int[] res=new int[nums.length-k+1];
List<Integer> list=new ArrayList();
for(int i=0;i<nums.length-k+1;i++){
int j=i+k-1;
int temp=Integer.MIN_VALUE;
for(int z=i;z<=j;z++){
temp=Math.max(temp,nums[z]);
}
list.add(temp);
}
for(int i=0;i<list.size();i++){
res[i]=list.get(i);
}
return res;
}
}
JAVA(双端队列***):
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums==null||nums.length<2) return nums;
// 双向队列 保存当前窗口最大值的数组位置 保证队列中数组位置的数值按从大到小排序
LinkedList<Integer> queue=new LinkedList<>();
// 结果数组
int[] result=new int[nums.length-k+1];
// 遍历nums数组
for(int i=0;i<nums.length;i++){
// 保证从大到小 如果前面数小则需要依次弹出,直至满足要求
while(!queue.isEmpty()&&nums[queue.peekLast()]<=nums[i]){
queue.pollLast();
}
// 添加当前值对应的数组下标
queue.addLast(i);
// 判断当前队列中队首的值是否有效
if(!queue.isEmpty()&&queue.peek()<=i-k){
queue.poll();
}
// 当窗口长度为k时 保存当前窗口中最大值
if(i>=k-1){
result[i+1-k]=nums[queue.peek()];
}
}
return result;
}
}