题解 | #滑动窗口的最大值#

滑动窗口的最大值

https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788

思路:最好不要直接对每个滑动窗口进行比较取最大值,不然容易造成超时
我们可以从下面几个方向考虑:
1.初始化:将第一个滑动窗口的最大值提取出来,然后放到结果中去,同时要维护一个最大值的位置的变量
2.遍历:随着滑动窗口的移动,可以有几种选择
1)如果最大值的位置仍处于这个滑动窗口期,那么此时滑动窗口最大值不变
2)如果此时最大值的位置小于窗口,当新加入的值大于前最大值,那么直接将最大位置的变量更新为新加入的值的位置
若是新加入的值小于前最大值,那么此时需要重新构建滑动窗口,然后拿出最大值即可,重复之前的步骤
class Solution {
private:
    int temp_maxval = INT_MIN;
public:
    vector<int> maxInWindows(const vector<int>& nums, int size) {
        int iSize = nums.size();
        vector<int> vec_res;
        if(iSize < size)
        {
            //没理解,为什么这里就不对
            const int i = *max_element(nums.begin(), nums.begin() + iSize);
            vec_res.push_back(i);
            return vec_res;
        }
        
        vector<int> vec_win;
        
        vec_win.assign(nums.begin(), nums.begin() + size);
        //temp_maxval = max(temp_maxval, *max_element(vec_win.begin(), vec_win.end()));
        int max_position = max_element(vec_win.begin(), vec_win.end()) - vec_win.begin();
        vec_res.push_back(nums[max_position]);
        for(int i = size; i< iSize; i++)
        {
            //记录每次滑动窗口的最大值所在的位置
            if(max_position >= i - size + 1 && nums[max_position] >= nums[i])
            {
                vec_res.push_back(nums[max_position]);
            }
            else if(max_position < i -size + 1&& nums[max_position] <= nums[i])
            {
                max_position = i;
                vec_res.push_back(nums[max_position]);
            }
            else if(max_position >= i - size + 1 && nums[max_position] < nums[i])
            {
                max_position = i;
                vec_res.push_back(nums[max_position]);
            }
            else{
                vector<int> temp;
                temp.assign(nums.begin() + i - size + 1, nums.begin() + i + 1);
                //max_position代表的是当前的vec的指针位置,我们需要做的是还原即可
                max_position = max_element(temp.begin(), temp.end()) - temp.begin() + i - size + 1;
                vec_res.push_back(nums[max_position]);
            }
            
        }
        
        return vec_res;
    }
};



全部评论

相关推荐

点赞 评论 收藏
分享
求offer的大角牛:不吃香菜
点赞 评论 收藏
分享
04-25 19:29
已编辑
宁波大学 运营
被普调的六边形战士很高大:你我美牛孩
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务