剑指 Offer 59 - I. 滑动窗口的最大值

题目:

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。

示例:

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7] 
解释: 

  滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

 

提示:

你可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数组的大小。

 

 

代码:

 1 class Solution {
 2     public int[] maxSlidingWindow(int[] nums, int k) {
 3         
 4         //数组为空
 5         if(nums.length==0){return new int[0];}
 6        
 7         //k大于数组长度
 8         if (nums.length <=k) {
 9             Arrays.sort(nums);
10             int[] res=new int[1];
11             res[0]=nums[nums.length-1];
12             return  res;
13         }
14         
15         //k小于数组长度
16         int max=0;
17         List<Integer> list=new ArrayList<>();
18         for (int i = k-1; i < nums.length; i++) {
19             max=Integer.MIN_VALUE;
20             for (int j = i; j >i-k ; j--) {
21                 max=max<nums[j]?nums[j] :max; 
22             }
23             list.add(max);
24         }
25         int[] res=new int[list.size()];
26         for(int i=0;i< res.length;i++){
27             res[i]=list.get(i);
28         }
29         return  res;
30                 
31     }
32 }

 

 

 

代码2:

//采用单调队列  ,对队列不熟悉,导致选取方法搞了半天,最后还弄错了几次,用了一小时才弄好

 1 class Solution {
 2     public int[] maxSlidingWindow(int[] nums, int k) {
 3 
 4         if(nums.length==0){
 5             return new int[0];
 6         }
 7         if (nums.length<=k){
 8             Arrays.sort(nums);
 9             int[] ints= new int[1];
10             ints[0] = nums[nums.length-1];
11             return ints;
12         }
13 
14         List<Integer> list=new ArrayList<>();
15         Deque<Integer> deque=new LinkedList<>();
16 
17         for (int i = 0; i < k; i++) {
18             while(!deque.isEmpty()&&deque.peekLast()<nums[i]){
19                 deque.pollLast();
20             }
21             deque.offer(nums[i]);
22         }
23         for (int i = 0,j=k; j < nums.length ; i++,j++) {
24             //当前最大元素
25             list.add(deque.peek());
26             //判断左下标是不是当前最大元素
27             if(nums[i]==deque.peek()){
28                 deque.poll();
29             }
30             //重新排列递减队列
31             while(!deque.isEmpty()&&deque.peekLast()<nums[j]){
32                 deque.pollLast();
33             }
34             deque.offer(nums[j]);
35         }
36         list.add(deque.poll());
37         int[] ints=new int[list.size()];
38         for (int i = 0; i < ints.length; i++) {
39             ints[i]=list.get(i);
40         }
41         return ints;
42     }
43 }

 

posted @ 2021-04-12 15:25  堤苏白  阅读(61)  评论(0)    收藏  举报