方法一:
//思路1:填满窗口,找出当前窗口最大值,将窗口移动一格
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(k == 0|| nums==null||nums.length == 0) return new int[]{};
Deque<Integer> q = new LinkedList();
int ma = nums[0],i = 0,coun=0;
ArrayList<Integer> maa = new ArrayList();
while(i < nums.length) {
if(coun < k) {//不满足窗口大小时,向队列头添加元素,窗口中计数++
q.addFirst(nums[i]);
coun++;
}
if(coun == k) {//窗口已满
for(int a:q) {//找到当前窗口的最大值
if(a > ma)
ma = a;
}
maa.add(ma);
q.removeLast();//将队列中最后一个元素出队,即滑动窗口向前移动
ma = Integer.MIN_VALUE;
coun--;
}
i++;
}
int[] res = new int[maa.size()];
for(i = 0;i < res.length;i++) {
res[i] = maa.get(i);
}
return res;
}
}
方法2:
//双层循环
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int[] b = new int[nums.length];
int i,coun = 0,j = 0;
for(i = 0;i < nums.length;i++) {
if(i + k <= nums.length) {//当从i开始的元素满足一个窗口大小时
b[i] = nums[i]; //将b[i]设置为起始元素
for(j = i;j < i + k;j++) {//从b[i]开始找出长度为k的窗口的最大值,并记录在b[i]中
b[i] = Math.max(b[i], nums[j]);
}
coun++;
}
}
int[] c = new int[coun];
for(i = 0; i< coun;i++){
c[i] = b[i];
}
return c;
}
}