首页 > 其他分享 >滑动窗口最大值

滑动窗口最大值

时间:2023-04-23 22:11:23浏览次数:23  
标签:index right 窗口 nums int 最大值 tree vector 滑动

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。
你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。

1. 暴力遍历(超时)

暴力法
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> res;
        for(int i=0;i<n-k+1;i++){
            int mx = INT_MIN;
            for(int j=i;j<i+k;j++)
                mx = max(mx,nums[j]);
            res.push_back(mx);
        }
        return res;
    }
};

2. 红黑树

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> res;
        map<int,int> m;
        for(int i=0;i<k-1;i++)
            m[nums[i]]++;
        for(int i=k-1;i<n;i++){
            if(i!=k-1){
                m[nums[i-k]]--;
                if(m[nums[i-k]]==0) m.erase(nums[i-k]);
            }
            m[nums[i]]++;
            auto it = m.rbegin();
            res.push_back(it->first);
        }
        return res;
    }
};

3. 线段树

套模板
class Solution {
public:

    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> res;
        vector<TreeNode> tree(n*4);//线段树
        build(nums,tree,0,0,n-1);
        for(int i=0;i<n-k+1;i++){
            int val = query(tree,0,i,i+k-1);
            res.push_back(val);
        }
        return res;
    }
    
    struct TreeNode {
    int left; // 节点区间左边界
    int right; // 节点区间右边界
    int value; // 节点存储的信息,这里以区间最值为例
};
    void build(vector<int>& arr, vector<TreeNode>& tree, int index, int left, int right) {
        tree[index].left = left;
        tree[index].right = right;
        // 叶子节点,存储输入数组的元素值
        if (left == right) {
            tree[index].value = arr[left];
            return;
        } 
        // 非叶子节点,递归构建左子树和右子树
        int mid = (left + right) / 2;
        build(arr, tree, index * 2 + 1, left, mid);//递归建左树
        build(arr, tree, index * 2 + 2, mid + 1, right);//递归建右树
        // 更新当前节点的信息,这里以区间最值为例
        tree[index].value = max(tree[index * 2 + 1].value, tree[index * 2 + 2].value);
}

    int query(vector<TreeNode>& tree, int index, int left, int right) {
        // 当前节点区间与查询区间完全重合,直接返回节点存储的信息
        if (tree[index].left == left && tree[index].right == right) 
            return tree[index].value;
        else {
            // 否则,根据查询区间与节点区间的关系递归查询左子树或右子树
        int mid = (tree[index].left + tree[index].right) / 2;
        // 查询区间完全位于左子树
        if (right <= mid) 
            return query(tree, index * 2 + 1, left, right);
        // 查询区间完全位于右子树
        else if (left > mid) 
            return query(tree, index * 2 + 2, left, right);
        // 查询区间同时位于左子树和右子树,取两者查询结果的最值
        else 
            return max(query(tree, index * 2 + 1, left, mid), query(tree, index * 2 + 2, mid + 1, right));
    }
    }
};

4. 优先队列(大根堆)

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        priority_queue<pair<int, int>> q;
        for (int i = 0; i < k-1; ++i) 
            q.push({nums[i],i});//值和索引对
        vector<int> res;
        for (int i = k-1; i < n; i++) {
            q.push({nums[i], i});
            while (q.top().second <= i - k) 
                q.pop();
            res.push_back(q.top().first);
        }
        return res;
    }
};

5. 双端队列(单调栈操作最优解)

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> res;
        deque<int> q;//双端队列存储下标,从后端进行类似单调栈的操作
        for (int i = 0; i < k-1; ++i) {
            while (!q.empty() && nums[i] >= nums[q.back()]) //当前数把小数挤出
                q.pop_back();
            q.push_back(i);//留在最前头的一定是最大的
        }
        for (int i = k-1; i < n; ++i) {
            while (!q.empty() && nums[i] >= nums[q.back()]) //继续挤
                q.pop_back();
            q.push_back(i);
            while (q.front() <= i - k) //从前端判断队头是否合法
                q.pop_front();
            res.push_back(nums[q.front()]);
        }
        return res;
    }
};

标签:index,right,窗口,nums,int,最大值,tree,vector,滑动
From: https://www.cnblogs.com/929code/p/17347924.html

相关文章

  • 盘点一道窗口函数的数据分析面试题
    今日鸡汤云母屏风烛影深,长河渐落晓星沉。大家好,我是热心读者。前几天在群里看到有人问了这样一道题,我觉得对一些新手了解窗口函数很有裨益,因此拿出来以飨读者。至于为什么要拿窗口函数来说事儿呢?因为目前的数分面试,只要考sql,窗口函数是100%会问的。从另一个侧面来讲,窗口函数是检验......
  • 用友U8 13.0出纳日记账查询后,窗口关闭不了,软件卡死解决办法
    用友U8出纳日记账查询后,窗口关闭不了,软件卡死解决办法电脑环境:win10、用友U813.0现象:用友U8登录出纳管理,查询一次日记账后,重新在查询其他日记账窗口不能操作,任务管理器里面出纳管理显示未响应尝试解决方案:卸载U8重新安装,好了两天,问题重现;修改U8兼容到winxp,管理员身份运......
  • sdl2实现窗口管理
    #include<SDL2/SDL.h>intmain(intargc,char*argv[]){  //初始化SDL2  SDL_Init(SDL_INIT_VIDEO);  //创建窗口  SDL_Window*window=SDL_CreateWindow(    "SDL2Window",      //窗口标题    SDL_WINDOWPOS_CENTERED,......
  • c语言刷——滑动窗口&&双指针 leetcode合集
    目录字符串问题3.无重复字符的最长子串76.最小覆盖子串424.替换后的最长重复字符438.找到字符串中所有字母异位词1208.尽可能使字符串相等连续1的问题485.最大连续1的个数487.最大连续1的个数II(p)1004.最大连续1的个数III综合题239.滑动窗口最大值字符串问题3.无重......
  • 滑动窗口
    滑动窗口1. 概念解释是双指针的一种,有快慢两个指针,慢指针指向窗口的起始位置,快指针指向窗口的末端位置;不断的调节子序列的起始位置和终止位置,从而得出结果。可参考的详细解释  2. 解题思路/模板intleft;//左指针intright;//右指针intvar;//随着......
  • 剑指Offer——59-I.滑动窗口的最大值(c语言)
    title:剑指Offer59-I.滑动窗口的最大值(c语言)给定一个数组nums和滑动窗口的大小k,请找出所有滑动窗口里的最大值。示例:输入:nums=[1,3,-1,-3,5,3,6,7],和k=3输出:[3,3,5,5,6,7]解释:滑动窗口的位置最大值-----------------......
  • toga的图像按钮和窗口管理
    Toga提供了多种常用控件,如按钮、标签、输入框等,还提供了窗口管理功能,可以用于创建跨平台的GUI应用程序。下面分别介绍图像按钮和窗口管理的用法。图像按钮-toga.ImageButtontoga.ImageButton用于创建一个图像按钮控件,用于触发操作或事件。常用参数:id:按钮控件的唯一标识符。......
  • umy-ui表格单行编辑(解决单行编辑滑动后失效问题)
    TableRowEdit.vue<template><div><ux-grid:data="tableData"tooltip-effect="dark"show-overflow="tooltip":cell-style="{'text-align':'center'}&q......
  • xshell断开ssh远程窗口,nginx进程被杀死
    主要原因:是openssh8+以上的版本对安全策略做了修改解决方法:在/usr/lib/systemd/system/[email protected] 配置增加KillMode=process[Unit]Description=OpenSSHper-connectionserverdaemonDocumentation=man:sshd(8)man:sshd_config(5)Wants=sshd-keygen.serviceAfter=sshd-ke......
  • C#窗口错误
    具体的错误是,我在主窗口打开了一个新的窗口,我关闭它之后,重新打开,就出现了这个错误这个错误是这样的,如下图所示 两种解决方式,其实本质上是一种,就是重写窗口的Onclosing的方法。第一种,直接在被调用窗口的cs里面重写这个方法,如下图所示。protectedoverridevoidOnClosing(Ca......