栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

leetcode239. 滑动窗口最大值(java详解)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode239. 滑动窗口最大值(java详解)

一:题目

二:思路 1:lc通过版
class Solution {
    


    public int[] maxSlidingWindow(int[] nums, int k) {
        
        if (nums.length == 1) return nums;

        MyQueue queue = new MyQueue();

        int len = nums.length - k + 1;//代数求出
        int[] ans = new int[len];
        int index = 0;

        for (int i = 0; i < k; i++) {
            queue.add(nums[i]);
        }

        ans[index++] = queue.peek();

        for (int i = k; i < nums.length; i++) {
            //移除队列 首个元素 可能最大值就是首部元素,也可能不是
            queue.poll(nums[i-k]);
            //添加新元素
            queue.add(nums[i]);
            ans[index++] = queue.peek();
        }


        return ans;
    }
}


class MyQueue{

    Deque deque = new LinkedList<>();
    
    //poll元素的的话,当前的这个数组是否为空,还有的就是当前队首元素是否为该窗口的最大值,如果是就移除
    //如果不是最大值的话,那么该滑动窗口中的元素的个数是不够k个的(因为我只是记录元素的相对位置)
    public void poll(int val) {
        if (!deque.isEmpty() && deque.peek() == val) {//队首元素
            deque.poll();
        }
    } 

    //在队尾添加元素
    //得判断队列中的尾部元素 tail 跟我们的要插入的值 insert 大小关系
    // tail < insert 那么的话 我们就移除队列尾部元素
    // tail > insert 那么的话 我们就正常添加
    public void add(int val) {
        while (!deque.isEmpty() && val > deque.getLast()) {//比队尾元素大的话
            deque.removeLast();
        }   
        deque.add(val);//比队尾元素小的话
    }

    //访问首部元素
    public int peek() {        
        return deque.peek();
    }


}
2:lc超时版
class Solution {
    

    public int max(int[] segment,int n) {
        int maxx = -999999;
        for (int i = 0; i < n; i++) {
            if (maxx < segment[i]) {
                maxx = segment[i];
            }
        }
        return maxx;
    }

    public int[] maxSlidingWindow(int[] nums, int k) {
        
        int len = nums.length-k+1;//代数求解
        int[] ans = new int[len];
        int ansIndex = 0;

        for (int i = 0; i < len; i++) {
            int[] temp = new int[k];
            int tempIndex = 0;
            int count = 0;
            int j = i;

            while (count != k) {
                temp[tempIndex++] = nums[j++];
                count++;
            }

            int eachAns = max(temp,k);
            ans[ansIndex++] = eachAns;
        }

        return ans;

    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/855466.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号