数据结构&算法&人工智能

剑指offer编程题—滑动窗口的最大值

2020-03-15  本文已影响0人  零岁的我

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

解题思路
定义三个指针(数组新的下标)i,j,t,保持i指向当前滑动窗口的最后一个元素;j指向上一个滑动窗口内的最大值,当j同时也在当前滑动窗口内时,j指向的元素也是当前滑动窗口的最大值;当j指向的最大元素不在当前滑动窗口内时,借助指针t(相当于回退i指针)从j指向位置的前一个位置开始更新最大元素。

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size)
    {
        vector<int> result;
        if(size<1 || num.size()<size) return result;
        int i,j,t; //i指向当前访问元素,j指向当前最大元素,当j不在滑动窗口内时用t更新j
        int m=0;
        for(i=0;i<size;++i){//获得第一个滑动窗口内的最大值
            if(num[i]>m) m=num[i],j=i;
        }
        result.push_back(m); 
        while(i<num.size()){ //i始终指向当前滑动窗口的最后一个元素
            if(num[i]>m){ //更新当前滑动窗口内的最大值
                m=num[i];
                j=i;
            }
            else if(i-j==size){ //j指向的当前最大元素不在滑动窗口内
                t=j+1;
                m=num[t];
                j=t;
                while(t<=i){ //更新当前滑动窗口内的最大值
                    if(num[t]>m) m=num[t],j=t;
                    ++t;
                }
            }
            result.push_back(m);
            ++i;
        }
        return result;
    }
};
上一篇 下一篇

猜你喜欢

热点阅读