剑指offer 滑动窗口的最大值
1.设一个boolean标志maxIsStart,代表最大值max是不是这个窗口最左边的值,也就是窗口开始位置的值.
2.先求出第一个滑动窗口的最大值max,判断max是不是这个窗口最左边的值,如果是则maxIsStart=true;
boolean maxIsStart=max==nums[left]?true:false;
3.接下来将窗口向右滑动 left++ right++;
4.如果上一个窗口的最大值max不是上一个窗口最左边的值,则只需要比较新加进窗口的值(当前窗口的最右边 的值)和上一个窗口的max的大小.
max=Math.max(max,nums[i]);
否则,遍历当前窗口并求出当前窗口的最大值max
max=nums[left];
for(int i=left+1;i<=right;i++){
max=Math.max(max,nums[i]);
}
5.将maxIsStart设置成对应值
boolean maxIsStart=max==nums[left]?true:false;
6.窗口继续向右滑动,重复第4步和第5步
完整代码
java
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length==0){
return new int[0];
}
int left=0;
int right=k-1;
int[] result=new int[nums.length-k+1];//存储结果
int max=nums[left];
for(int i=left;i<=right;i++){
max=Math.max(max,nums[i]);
}
result[left]=max;
boolean maxIsStart=max==nums[left]?true:false;
left++;
right++;
while(right<nums.length){
if(maxIsStart){
max=nums[left];
for(int i=left+1;i<=right;i++){
max=Math.max(max,nums[i]);
}
}else{
max=Math.max(max,nums[right]);
}
result[left]=max;
maxIsStart=max==nums[left]?true:false;
left++;
right++;
}
return result;
}
}