美文网首页
滑动窗口最大值

滑动窗口最大值

作者: 小幸运Q | 来源:发表于2021-04-05 21:46 被阅读0次

20190505171747817.gif

map法(很笨)

利用map红黑树的有序及删除

class Solution {
public:
    map<int,int>m;
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int>res;
        if(k>nums.size()){
            return res;
        }

        for(int i=0;i<k;i++){
            if(m.count(nums[i])==0){
                m[nums[i]]=1;
            }
            else{
                m[nums[i]]++;
            }                
        }
        res.push_back((--m.end())->first);
        for(int i=k;i<nums.size();i++){
            if(m.count(nums[i])==0){
                m[nums[i]]=1;
            }else{
                m[nums[i]]++;
            }
            if(m[nums[i-k]]==1){
                m.erase(nums[i-k]);
            }
            else{
                m[nums[i-k]]--;
            }
            res.push_back((--m.end())->first);
        }
        return res;
    }
};

单调队列

(1)如何得到最优解?

<1> 保证窗口中的最大值始终在窗口的最左端。while 将窗口中所有小于或等于当前新加入元素的元素移出,将当前元素加入窗口;

(2)如何保证最优质在有效期内?

<2> while 如果窗口最左端的元素的下标超出窗口的范围,则将其移出窗口;
<3> 每个时刻窗口中的元素最大值都在窗口的最左端,也就是头部,可以直接输出。

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int>res;
        list<pair<int,int>>list;
        if(k>nums.size()){
            return res;
        }
        int j;
        list.push_back(make_pair(nums[0],0));
        for(int i = 1; i < k;i++){
            while(!list.empty()&&list.back().first<nums[i]){
                list.pop_back();
            }          
            list.push_back(make_pair(nums[i],i));  
        }
        res.push_back(list.begin()->first);
        for(int i = k; i < nums.size();i++){
            j=i-(k-1);
            while(!list.empty()&&list.back().first<nums[i]){
                list.pop_back();
            }
            list.push_back(make_pair(nums[i],i));
            while(!list.empty()&&list.begin()->second<j){
                list.pop_front();
            }
            res.push_back(list.begin()->first);
        }
        return res;
    }
};

相关文章

  • 队列的最大值

    滑动窗口的最大值给定一个数组和滑动窗口的最大值,找出所有滑动窗口里的最大值。例如输入[2, 3, 4, 2, 6,...

  • 剑指offer | 滑动窗口的最大值

    滑动窗口的最大值 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值 示例输入:{2, 3, 4, 2, ...

  • 59-滑动窗口最大值、队列的最大值

    1. 滑动窗口的最大值 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例:输入:...

  • JZ-064-滑动窗口的最大值

    滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,...

  • 剑指Offer66题

    1、滑动窗口的最大值 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4...

  • 面试题59(剑指offer)--队列的最大值

    题目一: 滑动窗口的最大值。给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3...

  • 剑指Offer Java版 面试题59:队列的最大值

    题目一:滑动窗口的最大值。给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3...

  • 面试题59:队列的最大值

    题目 滑动窗口的最大值给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3,4,...

  • 栈和队列

    剑指offer所有的题目总结 牛客 滑动窗口的最大值 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值...

  • 剑指offer 59-1 滑动窗口内的最大值

    给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 使用一个队列记录滑动窗口内的最大值....

网友评论

      本文标题:滑动窗口最大值

      本文链接:https://www.haomeiwen.com/subject/idzdkltx.html