模拟--滑动窗口最大值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37037492/article/details/85331408

https://leetcode-cn.com/problems/sliding-window-maximum/

AC1

模拟,暴力152ms

class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
    vector<int>ans;
    if(nums.empty())
        return ans;
    list<int> window;
    list<int>::iterator it;
    for (int j = 0; j < k; ++j) {
        window.push_back(nums[j]);
    }
    for (int i = k; i <= nums.size(); ++i) {
        //查找最大值
        it = max_element(window.begin(),window.end());
        //添加至ans
        ans.push_back(*it);
        window.erase(window.begin());
        window.push_back(nums[i]);
    }
    return ans;
}
};

AC2

56ms
每隔k个求一次最大值,就是优化求最大值的地方。当前最大值没有出窗口时,只需要比较新插入的值与最大值。

vector<int> maxSlidingWindow(vector<int>& nums, int k) {
    vector<int>ans;
    if(nums.empty())
        return ans;
    list<int> window;
    list<int>::iterator it;
    for (int j = 0; j < k; ++j) {
        window.push_back(nums[j]);
    }
    //查找最大值
    it = max_element(window.begin(),window.end());
    int index =distance(window.begin(),it);
    //添加至ans
    ans.push_back(*it);
    for (int i = k; i < nums.size(); ++i) {
        window.erase(window.begin());
        window.push_back(nums[i]);
        index--;
        if(index<0){//出窗口
            it = max_element(window.begin(),window.end());
            index =distance(window.begin(),it);
            ans.push_back(*it);
        } else{//未出窗口
            if(nums[i]>(*it)){//新入的大于原最大值
                index = k-1;//更新最大值位置
                ans.push_back(nums[i]);
                it = --window.end();//更新window最大值迭代器的指向,更新为最后一个
            } else{
                ans.push_back(*it);
            }
        }
    }
    return ans;
}

猜你喜欢

转载自blog.csdn.net/qq_37037492/article/details/85331408