《剑指Offer》之滑动窗口的最大值


题目描述


给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组
{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]}。

注:本系列均是在牛客网《剑指Offer》在线编程测试通过,并且在VS2015环境下实验通过;

代码如下所示:
第一种代码采用的是容器vector 来存放数组中所有的size大小的子数组个数并放入vector容器中,通过迭代容器中的子数组进行求最大值就好了:

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size)
    {    int max_num = 0;
         vector<int> result;
         if(num.empty()) return result;
         if(size - num.size()) return result;

         vector<int> temp;
         vector<vector<int>> matrix;
         for(int i = 0; i < int(num.size() - size); i++){
             for(int j = i;j < i+size;j++){
                 temp.push_back(num[j]);
             }
             matrix.push_back(temp);
             temp.clear();
         }

         for(int i = 0;i < matrix.size(); i++){
             int temp_ = matrix[i][0];
             for(int j = 0; j < matrix[0].size();j++){
                 temp_ = max(temp_,matrix[i][j]);
             }
             result.push_back(temp_);
         }
         return result;
    }
};

第二种直接采用在大循环下直接嵌套小循环遍历就行了时间复杂度为O(m*n),其中m为输入数组大小,n为窗口大小;

代码如下所示;

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size)
    {
        vector<int> result;
        if (num.empty()) return result;
        if ((int)(num.size() - size) < 0) return result;

        for (int i = 0; i < (int)(num.size() - size + 1); i++) {
            int max_value = 0;
            for (int j = i; j < (int)(i + size); j++) {
                if (num[j] > max_value)
                    max_value = num[j];
            }
            result.push_back(max_value);
        }
        return result;
    }
};


int main(int argc,char** argv) {

    //string ss;
    Solution test;
    vector<int> test_;
    vector<int> temp;
    test_.push_back(12);
    test_.push_back(13);
    test_.push_back(111);
    test_.push_back(21);
    test_.push_back(45);
    test_.push_back(34);
    test_.push_back(67);
    test_.push_back(78);
    test_.push_back(34);
    test_.push_back(23);
    temp = test.maxInWindows(test_,5);
    vector<int>::iterator itr = temp.begin();

    while (itr != temp.end()) {
        cout << *itr << endl;
        itr++;
    }
    system("pause");
    return 0;
}

结果如下
这里写图片描述

注:
由于这里面给定的size类型是unsigned int 无符号整型,所以在处理过程中需要进行强制转换
,还有一点在计算int型和unsigned int型的时候会有一个隐式转换,也就是int会先转换成unsigned int型,有时编译器会将int型转换成很大的unsigned int,所以这点是需要在实际操作中需要注意的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章