题解 | #滑动窗口的最大值#

滑动窗口的最大值

https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param num int整型一维数组
     * @param size int整型
     * @return int整型ArrayList
     */
    public ArrayList<Integer> maxInWindows (int[] num, int size) {
        // write code here
        Deque q = new ArrayDeque<int[]>();

        if (size == 0 || size > num.length)return new ArrayList<Integer>();
        int m = Integer.MIN_VALUE;


        for (int i = 0; i < size; i++) {     //前面size个单独处理
            m = Math.max(m, num[i]);
            while (q.size() > 0) {
                int[] fr = (int[]) q.peekLast();
                int fid = fr[1], fx = fr[0];
                if (num[i] >= fx)q.pollLast();
                else break;
            }
            q.addLast(new int[] {num[i], i});
        }
        int n = num.length;

        int []ans = new int[n - size + 1];
        ans[0] = m;

        for (int j = size; j < n; j++) {//遍历每一个元素
            int x = num[j];

            if (q.size() > 0) {           //根据下标判断是否还有用
                int[] fr = (int[]) q.peekFirst();
                int fid = fr[1];
                if (fid <= j - size)q.pollFirst();
            }
            while (q.size() > 0) {      //根据大小,如果右边有个比自己大的进来,自己就没用了,单调递减栈
                int[] fr = (int[]) q.peekLast();
                int fid = fr[1], fx = fr[0];
                System.out.println(x + ":" + fx);
                if (x >= fx)q.pollLast();
                else break;
            }

            if (q.size() > 0) {          //如果还有元素,那么最大值就是数组最大
                int[] fr = (int[]) q.peekFirst();
                int fx = fr[0];
                ans[j - size + 1] = fx;
            } else ans[j - size + 1] = num[j];
            q.addLast(new int[] {num[j], j});//如果没有元素,那么最大值就是自己
        }

        ArrayList<Integer>res = new ArrayList<Integer>();
        for (int i : ans)res.add(i);

        return res;
    }
}

全部评论

相关推荐

ResourceUtilization:我嘞个董事长
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务