给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
直观思路:先判断第一个滑块的最大值和位置;滑块的运动就是减去第一个数,加入后一个数;
判断加入的数是不是大于原来的max值,如果是,更新max值。
判断减去的数是否是原来max值,如果是,重新判断滑块里的最大值。如果不是max值依旧不变。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums==null||nums.length==0||k==0) return new int[0];
if(k==1) return nums;
int []res= new int[nums.length-k+1];
int max=nums[0],pos=0;
//计算第一个窗口最大值
for(int i=1;i<k;i++){
if(nums[i]>max){
max=nums[i];
pos=i;
}
}
int a=0;
res[a++]=max;
//对后面的窗口判断,新加入的数是否大于原来max值
//出去的值是不是原来max值
for(int i=k;i<nums.length;i++){
if(nums[i]>max){
max=nums[i];
pos=i;
}
else if(pos==i-k){
max=nums[i-k+1];
pos=i-k+1;
for(int j=i-k+2;j<=i;j++){
if(nums[j]>max){
max=nums[j];
pos=j;
}
}
} else{
}
res[a++]=max;
}
return res;
}
}