博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指Offer——查找队列中的最大值
阅读量:4227 次
发布时间:2019-05-26

本文共 1371 字,大约阅读时间需要 4 分钟。

题目描述:给定一个数组和滑动窗口k的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。分别找出这6个滑动窗口中的最大值,并保存到一个列表中。

最简单的思路就是分别找到这些滑动窗口,并用一个数组来保存,然后找出每个数组的最大值,但是因为比较每个数组需要时间复杂度为O(k),滑动窗口滑动的时间复杂度为O(n),所以总的时间复杂度为O(nk);

那么我们希望在窗口滑动的同时,进行最大值的更新,那么可以使用一个双向的队列来保存滑动窗口中的值,使最大值总是在双向队列的头部,新的元素和对尾的元素比较,如果队尾的元素小于新的元素,就把队尾的元素删除,然后从队尾加入新的元素。但是怎么判断在队列头的最大值是否过期呢,那么这就需要在双向队列中保存的是元素的下标,当发现队列头部的元素下标和当前下标的差值大于滑动窗口的大小的时候,说明该最大值过期,应该把他从队列头部删除掉。

实现的代码如下:

public class Solution {    public ArrayList
maxInWindows(int [] num, int size) { //这道题的解题思路主要有两点: //1、用一个双端队列ArrayDeque来保存滑动窗口中的元素 //2、双端队列里面保存的是元素的下标的值,而不是元素本身的值,这点非常重要,用于判断元素是否过期 ArrayList
aList = new ArrayList<>(); if(num == null || size<1 || num.length
aDeque = new ArrayDeque<>(); int begin; for(int i = 0; i
aDeque.peekFirst()){ aDeque.pollFirst(); } while(!aDeque.isEmpty() && num[i]>=num[aDeque.peekLast()]){ aDeque.pollLast(); } aDeque.add(i); if(begin >= 0){ aList.add(num[aDeque.peekFirst()]); } } return aList; }}

转载地址:http://tsnqi.baihongyu.com/

你可能感兴趣的文章
Professional Rootkits
查看>>
Financial Applications using Excel Add-in Development in C/C++
查看>>
Learning Joomla! Extension Development: Creating Modules, Components, and Plugins with PHP
查看>>
How to Cheat at IIS 7 Server Administration
查看>>
Simply JavaScript
查看>>
Expert SQL Server 2005 Integration Services
查看>>
Beginning SharePoint 2007: Building Team Solutions with MOSS 2007
查看>>
QoS Over Heterogeneous Networks
查看>>
Workflow in the 2007 Microsoft Office System
查看>>
IPv6 Advanced Protocols Implementation
查看>>
Pro InfoPath 2007
查看>>
Beginning VB 2005 Databases: From Novice to Professional
查看>>
Inside SQLite
查看>>
How to Cheat at Configuring Open Source Security Tools
查看>>
Microsoft SharePoint: Building Office 2007 Solutions in C# 2005
查看>>
Beginning Google Maps Applications with Rails and Ajax: From Novice to Professional
查看>>
Beginning JBoss® Seam: From Novice to Professional
查看>>
Professional XML
查看>>
Foundations of Security: What Every Programmer Needs to Know
查看>>
Pro WF: Windows Workflow in .NET 3.0
查看>>