滑动窗口的最大值

来源:互联网 发布:优酷出品的网络剧 编辑:程序博客网 时间: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
原创粉丝点击