2022/07/21---滑动窗口的最大值;

题目描述

遗留问题:2022/07/20—把字符串转换成整数; 滑动窗口的最大值
队列的最大值

解题思路

对于昨天的窗口最大值:单调队列,我的理解是------维护一个队列,从两个方面来考虑,以公司招人为例,一方面,进来一个新人,然后把能力比新人弱的都炒鱿鱼;另外一个方面,团队的人数是稳定的,当超过一定数量的人,就会考虑把年长的炒鱿鱼。也就是,新人能力强,裁掉能力弱的,团队人太多,裁掉年纪老的。根据这个思想。滑动窗口的最大值版本3的代码如下。

对于队列的最大值:一开始没看懂题目。后面自己看了一下评论才懂题目在讲啥。总的来说,是构建两个队列,一个队列存储所有的数值,一个队列用来滑窗,遍历保存这个队列的最大值。代码就不放了。

代码实现

滑动窗口的最大值版本3的代码

package cz;

import java.util.ArrayDeque;
import java.util.Deque;

public class maxSlidingWindow_0721 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int []nums = {1,3,1,2,0,5};
		int k = 3;
		int [] res=maxSlidingWindow(nums,k);
		System.out.print(res[0]);

	}
	
	public static int[] maxSlidingWindow(int[] nums, int k) {
		
		//判断是否为空数组
		if(nums==null || nums.length==0) {
			return new int [0];
		}
		
		//新建数组来保存结果
		int [] res=new int [nums.length-k+1];
		
		//新建双端队列来存放数组
		Deque<Integer> queue=new ArrayDeque<>();
		
		for(int i=0,j=0;i<nums.length;i++) {
			//保证队列里最大位置差为k-1
			if(!queue.isEmpty()&& i-queue.peek()>=k) {
				//去掉双端队列的第一个元素
				queue.poll();
			}
			//当当前元素大于队列尾,移除队列尾的元素
			while(!queue.isEmpty()&& nums[i]>nums[queue.peekLast()]) {
				queue.pollLast();
			}
			//将当前元素的位置插入队尾
			queue.offer(i);
			if(i>=k-1) {
				//保证队头是最大值
				res[j++]=nums[queue.peek()];
			}
			
			
		}
		return res;
		
		
		
	}
	

}

心得:不论是学习还是创作,正是因为心底那一股义无反顾地冲动,才会不断地成就更好的自己。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值