继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

数组滑动窗口比较最大值

别打扰我我要学习
关注TA
已关注
手记 276
粉丝 20
获赞 131

         

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));			}}


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP