ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

算法打卡第四周

2021-04-03 13:31:36  阅读:158  来源: 互联网

标签:deque nums int index 算法 maxValQueue result 打卡 四周


leetcode第2022题:滑动窗口的最大值
题目描述:
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
例如:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]

package datastruct;

import java.util.*;

/**
 * @Author: jxy
 * @Date: 2021/4/3 11:37
 */
public class SlidingWindow {

    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums.length == 0 || k == 1) {
            return nums;
        }
        //定义单调双端队列  (递减)
        ArrayDeque<Integer> deque = new ArrayDeque<>();
        int[] result = new int[nums.length - k + 1];
        int index = 0;
        while (index < nums.length) {
            int indexNum = nums[index];
            if (deque.isEmpty()) {
                deque.offer(indexNum);
            } else {
                //构建最大值队列
                while (deque.size() > 0 && deque.peekLast() < indexNum) {
                    deque.pollLast();
                }
                deque.offer(indexNum);
            }
            //移动窗口时,如果当前窗口不包含原窗口中的最大值,需要将之前的最大值从单调队列中移除掉
            if (index > k-1) {
                if (deque.peekFirst() == nums[index-k]) {
                    deque.pollFirst();
                }
            }
            //形成窗口
            if (index >= k-1) {
                //将当前窗口的最大值添加到结果集中
                result[index+1-k] =deque.peekFirst();
            }
            index++;
        }
        return result;

    }

}

leetcode第1900题:队列中的最大值

package datastruct;

import java.util.ArrayDeque;

/**
 * 需要维护一个普通队列 和一个单调的队列
 *
 * @Author: jxy
 * @Date: 2021/4/3 8:57
 */
public class MaxQueue {

    private  ArrayDeque<Integer> queue = new ArrayDeque<>();
    private  ArrayDeque<Integer> maxValQueue = new ArrayDeque<>();

    public MaxQueue() {

    }

    public int max_value() {
        if (maxValQueue.size() == 0) {
            return -1;
        }
        return maxValQueue.peek();

    }

    public void push_back(int value) {
        queue.offer(value);
        if (maxValQueue.size() == 0) {
            maxValQueue.offer(value);
        } else {
            Integer last = maxValQueue.peekLast();
            while (last != null && last < value) {
                maxValQueue.pollLast();
                last = maxValQueue.peekLast();
            }
            maxValQueue.offer(value);
        }
    }

    public int pop_front() {
        Integer result = -1;
        if (queue.size() == 0) {
            return result;
        }
        result = queue.pollFirst();
        if (result.compareTo(maxValQueue.peekFirst()) == 0) {
            maxValQueue.pollFirst();
        }
        return result;

    }

}

标签:deque,nums,int,index,算法,maxValQueue,result,打卡,四周
来源: https://blog.csdn.net/xiaoyong_j/article/details/115415053

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有