滑动窗口的最大值
来源:互联网 发布:优酷出品的网络剧 编辑:程序博客网 时间:2024/05/29 06:35
题目描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。
#include <iostream>#include <vector>#include <deque>using namespace std;//滑动窗口的最大值vector<int> maxInWindows(const vector<int>& num, unsigned int size){ int length = num.size(),i; vector<int> MaxInWindows; if(size <= length && size >= 1) {deque<int> index;//考虑前size次的情况,前面的情况不存在index弹出的情况,则分开考虑for (i = 0; i < size ; i++){while (!index.empty() && num[i] >= num[index.back()])index.pop_back();index.push_back(i);}for (i = size; i < length; i++){MaxInWindows.push_back(num[index.front()]);while(!index.empty() && num[i] >= num[index.back()])index.pop_back();if(!index.empty() && i >= index.front() + size)index.pop_front();index.push_back(i);}MaxInWindows.push_back(num[index.front()]); } return MaxInWindows;}//测试用例vector<int> maxInWindows(const vector<int>& num, unsigned int size);void Test(char* testName, const vector<int>& num, unsigned int size, const vector<int>& expected){ if(testName != NULL) printf("%s begins: ", testName); vector<int> result = maxInWindows(num, size); vector<int>::const_iterator iterResult = result.begin(); vector<int>::const_iterator iterExpected = expected.begin(); while(iterResult < result.end() && iterExpected < expected.end()) { if(*iterResult != *iterExpected) break; ++iterResult; ++iterExpected; } if(iterResult == result.end() && iterExpected == expected.end()) printf("Passed.\n"); else printf("FAILED.\n");}void Test1(){ int num[] = {2, 3, 4, 2, 6, 2, 5, 1}; vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); int expected[] = {4, 4, 6, 6, 6, 5}; vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int)); unsigned int size = 3; Test("Test1", vecNumbers, size, vecExpected);}void Test2(){ int num[] = {1, 3, -1, -3, 5, 3, 6, 7}; vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); int expected[] = {3, 3, 5, 5, 6, 7}; vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int)); unsigned int size = 3; Test("Test2", vecNumbers, size, vecExpected);}// increasingly sortedvoid Test3(){ int num[] = {1, 3, 5, 7, 9, 11, 13, 15}; vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); int expected[] = {7, 9, 11, 13, 15}; vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int)); unsigned int size = 4; Test("Test3", vecNumbers, size, vecExpected);}// decreasingly sortedvoid Test4(){ int num[] = {16, 14, 12, 10, 8, 6, 4}; vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); int expected[] = {16, 14, 12}; vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int)); unsigned int size = 5; Test("Test4", vecNumbers, size, vecExpected);}// size of sliding windows is 1void Test5(){ int num[] = {10, 14, 12, 11}; vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); int expected[] = {10, 14, 12, 11}; vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int)); unsigned int size = 1; Test("Test5", vecNumbers, size, vecExpected);}// size of sliding windows is same as the array lengthvoid Test6(){ int num[] = {10, 14, 12, 11}; vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); int expected[] = {14}; vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int)); unsigned int size = 4; Test("Test6", vecNumbers, size, vecExpected);}// size of sliding windows is 0void Test7(){ int num[] = {10, 14, 12, 11}; vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); vector<int> vecExpected; unsigned int size = 0; Test("Test7", vecNumbers, size, vecExpected);}// size of sliding windows is greater than the array lengthvoid Test8(){ int num[] = {10, 14, 12, 11}; vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); vector<int> vecExpected; unsigned int size = 5; Test("Test8", vecNumbers, size, vecExpected);}int main(int argc, char* argv[]){ Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); Test7(); Test8();return 0;}
0 0
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 在C/C++中如何然程序停住,等待debugger
- 英文操作系统中,CMD显示中文乱码问题;让Google chrome正常显示中文
- Atom飞行手册翻译: 3.5 创建主题
- 十年嵌入式arm-linux总结
- python安装各种插件
- 滑动窗口的最大值
- 2015年 华为机试题 (二) 去除重复字符并排序
- js数组遍历 千万不要使用for...in...
- flex4 flash与容器的信息交互
- java如何获取方法参数名
- 这个人的文章
- CF 559A///几何
- Smali语法简单介绍
- 最小生成树