题目描述
遗留问题: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;
}
}
心得:不论是学习还是创作,正是因为心底那一股义无反顾地冲动,才会不断地成就更好的自己。