多一些Aha Time,发现技术的美妙🍺|

啊原来是这样呀

园龄:8年3个月粉丝:3关注:9

【剑指offer】34.滑动窗口的最大值

总目录:

算法之旅导航目录

 

1.问题描述

给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
窗口大于数组长度或窗口长度为0的时候,返回空。
数据范围: 1≤n≤100000≤size≤10000,数组中每个元素的值满足 ∣val∣≤10000
要求:空间复杂度 O(n),时间复杂度 O(n)

 

2.问题分析

 1双指针,第一次放窗口时遍历获得最大值,后续滑动过程中先关注滑入数值、再关注滑出数值,不到不得已不要去遍历窗口内的元素

2方法2没看懂,需要再研究

3.代码实例

双指针

复制代码
 1 class Solution {
 2   public:
 3     const int minVal = -10000;
 4     int getMax(const vector<int> vec, int headId, int endId) {
 5         //保护
 6         if (headId < 0 || endId < 0 || headId >= vec.size() || endId >= vec.size()) {
 7             return minVal;
 8         }
 9 
10         int curMax = minVal;
11         for (int i = headId; i <= endId; i++) {
12             if (vec[i] > curMax) {
13                 curMax = vec[i];
14             }
15         }
16 
17         return curMax;
18     }
19 
20     vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
21         vector<int> ret;
22         int fieldSize = num.size();
23 
24 
25         //域太小
26         if (size <= 0 || fieldSize < size) {
27             return ret;
28         }
29 
30         //个数
31         int maxValCount = fieldSize - size + 1;
32 
33         //双指针
34         int curMax = minVal;
35         int headId = 0, endId = headId + size - 1;
36 
37         //寻找第一窗口最大值
38         curMax = getMax(num, headId, endId);
39         ret.push_back(curMax);
40 
41         //滑动窗口
42         for (int i = 1; i < maxValCount; i++) {
43             //指针移动
44             headId++;
45             endId++;
46 
47             //新滑入的是否更大,更新最大值
48             if (num[endId] > curMax) {
49                 curMax = num[endId];
50                 ret.push_back(curMax);
51                 continue;
52             }
53 
54             //检查刚才滑出的是否是最大值,寻找新的最大值
55             if (num[headId - 1] == curMax) {
56                 curMax = getMax(num, headId, endId);
57                 ret.push_back(curMax);
58                 continue;
59             }
60 
61             //最大值保持不变
62             ret.push_back(curMax);
63         }
64 
65 
66         return ret;
67     }
68 };
View Code
复制代码

 

本文作者:啊原来是这样呀

本文链接:https://www.cnblogs.com/OhOfCourse/p/16891032.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   啊原来是这样呀  阅读(35)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起