【剑指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≤10000,0≤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 };
本文作者:啊原来是这样呀
本文链接:https://www.cnblogs.com/OhOfCourse/p/16891032.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步