首页 > 其他分享 >Day 13 第五章 栈与队列 |239. 滑动窗口最大值

Day 13 第五章 栈与队列 |239. 滑动窗口最大值

时间:2023-02-19 20:55:30浏览次数:34  
标签:13 int back value front que 239 push Day

239. 滑动窗口最大值

题目链接:https://leetcode.cn/problems/sliding-window-maximum/

看到题目的第一个想法:想到的使用暴力法把每一种情况给算出来,但是显然这样会超时

看完代码随想录后的想法:了解到了单调队列这种数据结构(也是一种自己可以实现的数据结构)

比较重要的是其函数的实现,一开始并不能理解,后面自己思考以后能够理解

pop函数:用来弹出不断改变的窗口的之前那一个值

这个pop函数只维护front 因为其他值是由push函数来删除的

push函数:

不仅是放入新的值,并且把前面比当前value小的数全给删掉,这样保证front一定是最大值

 1     #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 class Solution
 5 {
 6 private:
 7     class myqueue
 8     {
 9     public:
10         // front用来维护最大值
11         // 用来删除滑动窗口的第一个数组
12         void pop(int value)
13         {
14             if (!que.empty() && value == que.front())
15             {
16                 que.pop_front();
17             }
18         }
19         void push_back(int value)
20         {
21             while (!que.empty() && value > que.back())
22             {
23                 que.pop_back();
24             }
25             que.push_back(value);
26         }
27         int getfront()
28         {
29             return que.front();
30         }
31 
32     private:
33         deque<int> que;
34     };
35 
36 public:
37     vector<int> maxSlidingWindow(vector<int> &nums, int k)
38     {
39         myqueue que;
40         for (int i = 0; i < k; i++)
41         {
42             que.push_back(nums[i]);
43         }
44         vector<int> result;
45         result.push_back(que.getfront());
46         for (int i = k; i < nums.size(); i++)
47         {
48             que.pop(nums[i - k]);
49             que.push_back(nums[i]);
50             result.push_back(que.getfront());
51         }
52         return result;
53     }
54 };

 

347.前 K 个高频元素

题目链接:https://leetcode.cn/problems/top-k-frequent-elements/

看到代码随想录的第一想法:第一想法用hashmap 然后排序取前两个,但是qsort的时间复杂度nlogn,与题目要求不符合

看代码随想录后的想法:用优先级队列,用小顶堆,把小的排在前面,然后设置维护的个数位k,这样就能把big o降道 n logk.

学会了优先级队列的构造使用.

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 class Solution
 5 {
 6 private:
 7     class myqueue
 8     {
 9     public:
10         // front用来维护最大值
11         // 用来删除滑动窗口的第一个数组
12         void pop(int value)
13         {
14             if (!que.empty() && value == que.front())
15             {
16                 que.pop_front();
17             }
18         }
19         void push_back(int value)
20         {
21             while (!que.empty() && value > que.back())
22             {
23                 que.pop_back();
24             }
25             que.push_back(value);
26         }
27         int getfront()
28         {
29             return que.front();
30         }
31 
32     private:
33         deque<int> que;
34     };
35 
36 public:
37     vector<int> maxSlidingWindow(vector<int> &nums, int k)
38     {
39         myqueue que;
40         for (int i = 0; i < k; i++)
41         {
42             que.push_back(nums[i]);
43         }
44         vector<int> result;
45         result.push_back(que.getfront());
46         for (int i = k; i < nums.size(); i++)
47         {
48             que.pop(nums[i - k]);
49             que.push_back(nums[i]);
50             result.push_back(que.getfront());
51         }
52         return result;
53     }
54 };

用了挺长时间来学习相关的数据结构 已累麻了~

 

标签:13,int,back,value,front,que,239,push,Day
From: https://www.cnblogs.com/Liebelingszouxiang/p/17135558.html

相关文章

  • vue_day05
    目录今日内容详细一、组件其他二、组件间通信之父传子三、组件间通信之子传父四、ref属性五、动态组件1、不使用动态组件2、动态组件component标签3、keep-alive保持组件不......
  • day35
    1、leetcode435无重叠区间代码classSolution{publicinteraseOverlapIntervals(int[][]intervals){Arrays.sort(intervals,(a,b)->(a[0]-b[0]));......
  • day34
    1、leetcode860柠檬水找零classSolution{publicbooleanlemonadeChange(int[]bills){if(bills[0]!=5){returnfalse;}......
  • day10
    变量变量就是可变化的量Java是强类型语言,每个变量必须声明其类型Java变量是程序中最基本的存储单位(变量名,变量类型和作用域)注意:每个变量都有类型,类型可以是基本类型,......
  • 安装etcd3.4.13
    ETCD_VERSION='3.4.13'wgethttps://github.com/etcd-io/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gztar-xvfetcd-v${ETCD_VERS......
  • 【算法训练营day49】LeetCode121. 买卖股票的最佳时机 LeetCode122. 买卖股票的最佳时
    LeetCode121.买卖股票的最佳时机题目链接:121.买卖股票的最佳时机独上高楼,望尽天涯路感觉贪心会更简单,动态规划反而搞复杂了对于这道题。慕然回首,灯火阑珊处第一次看......
  • 决战圣地玛丽乔亚Day15 CAS和分布式锁
    volatile的问题:volatile只能保证读/写操作的原子性,没有办法保证变量的其他操作的原子性,例如++ 等非单独读/写操作。 相对于Synchronized的悲观锁方式,还有一种方式来......
  • 刷刷刷 Day 34 | 134. 加油站
    134.加油站LeetCode题目要求在一条环路上有n 个加油站,其中第i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1 个加油站需......
  • 《分布式技术原理与算法解析》学习笔记Day16
    分布式计算模式:流水线计算机中的流水线技术是一种将每条指令拆分为多个步骤,多条指令的不同步骤重叠操作,从而实现几条指令并行处理的技术。分布式领域的流水线计算模式,参......
  • 13.转换函数
    1.隐式与显示数据转换--在表达式中Oracle服务器能自动转换--fromvarchar2orchartonumber--fromvarchar2orchartodate--fromnumbertovarchar2......