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

题目:

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

示例:

[1,3,-1,-3,5,3,6,7]
[3,3,5,5,6,7] 
解释: 

 

提示:

你可以假设 总是有效的,在输入数组不为空的情况下,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 @   堤苏白  阅读(38)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示