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

滑动窗口的最大值

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

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型一维数组 
     * @param size int整型 
     * @return int整型ArrayList
     */
    public static int[] deque = new int[10000];
    public ArrayList<Integer> maxInWindows (int[] num, int size) {
        // write code here
        //求滑动窗口的最大值,可以通过单调队列,复杂度是o(n)
        //双端队列指针,头指针和尾指针
        if(size==0||size>num.length) return new ArrayList();
        int h=0;
        int t=0;
        // 先将size-1个位置的最值安排好
        for(int i=0;i<size-1;i++){
            while(h<t&&num[deque[t-1]]<=num[i]) t--;
            deque[t++] = i;
        }
        //一共收集结果的个数
        int m = num.length-size+1;
        int[] ans = new int[m];
        for(int l=0,r=size-1;r<num.length;l++,r++){
            while(h<t&&num[deque[t-1]]<=num[r]) t--;
            deque[t++] = r;
            ans[l] = num[deque[h]];
            if(deque[h]==l){
                h++;
            }
        }
        ArrayList<Integer> list =new ArrayList<>();
        for(int i=0;i<ans.length;i++){
            list.add(ans[i]);
        }
        // ArrayList<Integer> list= new ArrayList(Arrays.asList(ans)) ;
        return list;
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
没有offer的呆呆:薪资有的时候也能说明一些问题,太少了活不活得下去是一方面,感觉学习也有限
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务