一道Medium,两道Hard带你刷爆力扣单调栈(模板解题,学不会来捶我,发起收

代码 代码 1319 人阅读 | 0 人回复

<
Preface

继上篇【面试下频】详解单调栈,明天我们来说述一下如何用我给出的单调栈模板刷题。
所谓单调栈实在便是栈内乱元素具有单调性, 经常使用于处理下一个更年夜元素 这类成绩。
我们会讲一下此中最具代表性的三讲题,此中一讲Medium,两讲Hard,包管您看完必然有所播种:

  1. // 单调栈模板,假如没有懂能够看我的上篇文章
  2. for (遍历那个数组) {
  3.      while (栈没有为空 && 栈顶元素取当前数组元素比力) {
  4.          出栈;
  5.      }
  6.      进栈;
  7. }
复造代码
739. 逐日温度

Description

145355ntkfmgzzdffk0jm6.png

Simulation

思绪:我们先列一个表格阐发一下示例数据是怎样去的
第1天第2天第3天第4天第5天第6天第7天第8天温度7374757169727673下一个更下的温度第2天第3天第7天第6天第6天第7天无无天数好11421100起首念到确当然是暴力解法,两层 for 轮回挨个遍历一遍,计较天数好便可,工夫庞大度O(n^2)。
  get到暴力解法也很主要,究竟结果没有是甚么时分皆能念到最劣解,并且我们借能够基于暴力解法停止下一步劣化。
题目中请求计较下一个更下的温度的天数好,实在便是要找到本人右侧第一个比本人年夜的元素, 然后计较下标之好
很较着要用到一个单调加(栈头元素最小)的栈,经由过程O(n)的工夫庞大度(即遍历一遍)就可以找到每一个元素的右侧第一个比它年夜的元素,素质便是空间换工夫。

  • 为何是单调加?
    问:由于只要递加的时分,我们才气获得天数好,如74放进栈时,73便可出栈,第一天的天数好便获得了。
  • 怎样计较天数好?
    问:单调栈内乱只寄存元素的下标便可,需求数值比力时间接利用 t 便可。
  • 模板怎样用?⏬
既然曾经阐发出要用单调栈,我们能够间接把三板斧(模板)使出去:
  1. // 模板
  2. stack<int> stk;
  3. for (int i = 0; i < t.size(); i++) {                // 遍历温度数组t
  4.      while (!stk.empty() && t[i] > t[stk.top()]) {   // 出栈前提,连结单调加
  5.          stk.pop();
  6.      }
  7.      stk.push(i);                                    // 进栈,放进下标
  8. }
复造代码
正在脑中模仿一下收支栈的历程:


  • 栈为空,73的下标0进栈,栈内乱元素 0
  • 74 > 73,73出栈74进栈,天数好为1,栈内乱元素 1
  • 75 > 74,74出栈75进栈,天数好为1,栈内乱元素 2
从第两步就能够看出去,我们需求正在栈内乱元素出栈前经由过程下标计较天数好,增长一止便可:
  1.      while (!stk.empty() && t[i] > t[stk.top()]) {   // 出栈前提,连结单调加
  2.          res[stk.top()] = i - stk.top();    // 增加计较
  3.          
  4.          stk.pop();
  5.      }
复造代码
Solution

完好代码以下,能够测验考试一下,本题链接
  1. // hrh 8/28
  2. class Solution {
  3. public:
  4.      vector<int> dailyTemperatures(vector<int>& t) {
  5.          vector<int> res(t.size());
  6.          stack<int> stk;     
  7.          for (int i = 0; i < t.size(); i++) {                // 遍历
  8.              while (!stk.empty() && t[i] > t[stk.top()]) {   // 出栈前提
  9.                  res[stk.top()] = i - stk.top();             // 计较天数好值
  10.                  stk.pop();                                  // 连结单调加
  11.              }
  12.              stk.push(i);                                    // 进栈
  13.          }
  14.          return res;
  15.      }
  16. };
复造代码
总结一下解题历程:

  • 判定那讲题可否用单调栈处理
  • 判定单调性,给出三板斧
  • 模仿计较历程,删改模板获得成果
42. 接雨火

Description

145356msu93zyta389ucdq.png

Simulation

思绪:

  • 看图阐发,只要下一个年夜于即是本人的元素插进才会构成凸槽接到雨火。以是不言而喻,我们该当利用单调栈。
  • 单调性怎样判定?很较着,比本人小的能够间接插进,年夜的插进要让前里的小元素出栈,因而我们需求一个递加的栈(栈顶元素最小)。
  • 里积怎样计较?底 ✖ 高峻伙皆明白,然后按止计较,上面是阐发:
起首大白一下单调栈里到底要存甚么内乱容,每一个柱的下度?没有没有没有!我们需求下标去计较宽度,而下标又能够间接get到对应的下度,以是只需一个单调栈去存储下标就能够了。
145356tnrdkd53rgxa50sa.png

绘了一张图停止模仿计较历程,一组数[2,1,0,3] 从左到左顺次进栈:
<ul>2进栈,栈为空,下标i间接进栈,栈内乱元素 i 。
1
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则