leetcode队列单调栈- 滑动窗口中的最大值

import leetcode4.test.MonotonicQueue;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
<p>给你一个整数数组 <code>nums</code>,有一个大小为&nbsp;<code>k</code><em>&nbsp;</em>的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 <code>k</code>&nbsp;个数字。滑动窗口每次只向右移动一位。</p>

<p>返回 <em>滑动窗口中的最大值 </em>。</p>

<p>&nbsp;</p>

<p><strong>示例 1:</strong></p>

<pre>
<b>输入:</b>nums = [1,3,-1,-3,5,3,6,7], k = 3
<b>输出:</b>[3,3,5,5,6,7]
<b>解释:</b>
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       <strong>3</strong>
 1 [3  -1  -3] 5  3  6  7       <strong>3</strong>
 1  3 [-1  -3  5] 3  6  7      <strong> 5</strong>
 1  3  -1 [-3  5  3] 6  7       <strong>5</strong>
 1  3  -1  -3 [5  3  6] 7       <strong>6</strong>
 1  3  -1  -3  5 [3  6  7]      <strong>7</strong>
</pre>

<p><strong>示例 2:</strong></p>

<pre>
<b>输入:</b>nums = [1], k = 1
<b>输出:</b>[1]
</pre>

<p>&nbsp;</p>

<p><b>提示:</b></p>

<ul>
	<li><code>1 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
	<li><code>-10<sup>4</sup>&nbsp;&lt;= nums[i] &lt;= 10<sup>4</sup></code></li>
	<li><code>1 &lt;= k &lt;= nums.length</code></li>
</ul>
<div><div>Related Topics</div><div><li>队列</li><li>数组</li><li>滑动窗口</li><li>单调队列</li><li>堆(优先队列)</li></div></div><br><div><li>👍 1573</li><li>👎 0</li></div>
*/

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
	//通过队列来维持窗口,通过单调栈来维持队列的值
    public int[] maxSlidingWindow(int[] nums, int k) {
		MonotonicQueue window = new MonotonicQueue();
		List<Integer> res = new ArrayList<>();
		for (int i = 0; i < nums.length; i++) {
			if(i<k-1){
				window.push(nums[i]);
			}else{
				window.push(nums[i]);
				res.add(window.max());
				window.pop(nums[i-k+1]);
			}
		}
		int[] arr = new int[res.size()];
		for (int i = 0; i < res.size(); i++) {
			arr[i] = res.get(i);
		}
		return arr;
    }
}

class MonotonicQueue{
	LinkedList<Integer> q = new LinkedList<>();
	void push(int n){
		while(!q.isEmpty() && q.getLast() < n){
			q.pollLast();
		}
		q.addLast(n);
	}

	int max(){
		return q.getFirst();
	}

	void pop(int n){
		if(n == q.getFirst()){
			q.pollFirst();
		}
	}
}
//leetcode submit region end(Prohibit modification and deletion)



posted @   小傻孩丶儿  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2021-04-27 Lc40_组合总和II
2021-04-27 erlang环境构建,emqx测试工具安装
点击右上角即可分享
微信分享提示