为了账号安全,请及时绑定邮箱和手机立即绑定

数组滑动窗口比较最大值

标签:
Java

         

import java.util.ArrayList;import java.util.Arrays;import java.util.Deque;import java.util.List;import java.util.concurrent.LinkedBlockingDeque;/** * 有一个×××数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右滑动一个位置。 * 返回一个长度为n-w+1的数组res,res[i]表示每一种窗口状态下的最大值。 *  * 例: * 数组arr=[4,3,5,4,3,3,6,7] w=3,结果为[5,5,5,4,6,7] *  * 常规解连续比较w内的最大数,O(N*w) *  * 最优解O(N) * @author Administrator * */public class CompareArray {	/**	 * 双端队列存放着数组的下标值	 */	private static Deque<Integer> qmax = new LinkedBlockingDeque<Integer>();		public static List dowork(int[] arr,int size) {		List<Integer> l = new ArrayList<Integer>();		for(int i = 0,len = arr.length;i<len;i++) {						//1、如果qmax为空,直接把下标i放入qmax			if(qmax.isEmpty()) {				qmax.push(i);			}else {				//2、如果qmax末尾<=arr[i],则弹出				while(!qmax.isEmpty() && arr[qmax.getLast()]<=arr[i]) {					qmax.removeLast();				}				qmax.push(i);			}						//超过窗口大小的弹出			if(i - qmax.peekLast() == size) {				qmax.removeLast();			}						//拿到窗口内最大值			if(i>=size-1) {				l.add(arr[qmax.peekLast()]);			}		}				return l;	}		public static void main(String[] args) {		int[] i = {4,3,5,4,3,3,6,7};				System.out.println(dowork(i,5));			}}


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消