- 题目:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。
- 思路:
- 暴力法,两层循环,找到窗口的最大值
- 启发或者坑:
- 如果窗口大小k接近于n,那这个复杂度可能是n*2
- 代码:
class Solution { public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { //用栈实现队列,需要两个栈,每次2k的复杂度,插入和删除 //比如栈2,3,4,插入就是2,3,4,2,然后需要删除借助两个栈2,3,4,2,变成2,4,3,2,pop2,然后换到另外一个栈3,4,2 //对于这个题目而言,插入栈元素(如果栈没满,直接更新栈内最大值;如果栈到size,用两个栈先进先出顺便更新最大值),时间复杂度nk //如果直接每次遍历窗口大小也是k vector<int> res; int maxV; if (size == 0) return res; if (num.size() == 0) return res; if (num.size() < size) { /*maxV = num[0]; for (int j = 0; j < num.size(); j++) { if (num[j] > maxV) maxV = num[j]; } res.push_back(maxV);*/ return res; } for (int i = 0; i <= num.size()-size; i++) { maxV = num[i]; for (int j = 0; j < size; j++) { if (num[i+j] > maxV) maxV = num[i+j]; } res.push_back(maxV); } return res; } };
剑指offer 47.滑动窗口的最大值
猜你喜欢
转载自blog.csdn.net/Alexia23/article/details/104093211
今日推荐
周排行