复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46class Solution { public int[] maxSlidingWindow(int[] nums, int k) { //如果数组的长度为0或者k的值为0,那么直接返回0即可 if(nums.length == 0 || k == 0){ return new int[0]; } //建立一个双端队列用于存放过程中的值 Deque<Integer> deque = new LinkedList<>(); //存放结果的数组 int[] res = new int[nums.length - k + 1]; //刚开始滑动窗口里面没有k个元素,先用for移动滑动窗口,保证滑动窗口里面有k个元素 for(int i = 0; i < k;i++){ //想从队列的队头直接获取最大,就要保存队列里的元素是递减 //如果当队列中不为空且遍历到的nums[i]大于队列中的最后一个元素时, //将队列中的最后一个元素移除,直到队列为空,或者遇到队列中的元素大于nums[i] while(!deque.isEmpty()&&deque.peekLast() < nums[i]){//while deque.removeLast(); } //上述操作保证添加入队列里的值是单调递减以后,就可以num[i]加入到队列中 deque.addLast(nums[i]);//addLast } //在第一个滑动窗口形成的时候,它头部的第一个元素就是最大 res[0] = deque.peekFirst(); int n = nums.length ; for(int i = k;i < n;i++){ //数组的第一个数不能和队列第一个数一样 //比如数组是[1,-1],k = 1,如果没有这一步判断,那么res[0] = 1 ,res[1] = 1,但实际上res[1] = -1 if(deque.peekFirst() == nums[i - k]){ deque.removeFirst(); } //保证队列是单调递减的 while(!deque.isEmpty()&&deque.peekLast() < nums[i]){//while deque.removeLast(); } //保证递减后nums[i]将加入 deque.addLast(nums[i]); //因为这个for循环是从k开始的,要减去k,就回到res数组的原位了,上面已经算出了res数组的一个元素,res下标要往后移动一位 res[i - k + 1] = deque.peekFirst(); } //将最大值数组返回 return res; } }
最后
以上就是合适月光最近收集整理的关于滑动窗口最大值(LeetCode239)---队列(Java)的全部内容,更多相关滑动窗口最大值(LeetCode239)---队列(Java)内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复