浅谈单调队列、单调栈

       初谈这个话题,相信许多人会有一种似有所悟,但又不敢肯定的感受。没错,这正是由于其中“单调”一词的存在,所谓单调是什么,学过函数的people都知道单调函数或者函数的单调性,直白一点说单调就是一直增或一直减。例如:1,3,5,9就是一个单调增数列,数列中不存在后一个数比前一个数小的现象。那么一样,在这里谈到的话题也有相似特色。编程

       先说一下单调队列吧!      单调队列,就是一个符合单调性质的队列,它同时具备单调的性质以及队列的性质。他在编程中使用频率不高,但却占有相当重要的地位。它的做用很简单,就是为了维护一组单调数据,让咱们在运行的过程当中可以快速寻求前k个或后k个中最大或最小的值。    至于单调栈,相信看完上面的叙述后,都会有一个大概的理解,单调栈就是一个符合单调性质的栈它同时具备单调的性质以及栈的性质。在做用方面二者是相同的,差异仅是在编程过程当中所维护的数组的方式不一样。数组

       下面我会举个简单的列子来解释单调队列及单调栈。函数

       例题:有一组数据1,5,9,4,7,8,6,他们会依此输入,同时,在某一时刻会让你求出后n个数中的最大值。                  spa

       根据题意,咱们能够得出这样一个结论,若后一个数大于前一个数,则结果一定不会是前一个数(好比如今输入了1,5,因为1<5,因此不管是后几个数中的最大值均不会为1),所以,咱们只需维护一个单调递减的数组即可快速求得所需值。(数组变化以下:输入——1,数组——1;输入——5,因为5>1删去1添入5,数组——5;输入——9,因为9>5删去5添入9,数组——9;输入——4,因为4<9直接添入,数组——9,4;输入——7,因为7>4同时7<9所以删去4添入7,数组——9,7;输入——8,因为8>4同时8<9所以删去7添入8,数组——9,8;输入——6,因为6<8直接添入,数组——9,8,6。)总的来讲,它的本质就是当你在插入一个值时,应将在他以前存入的全部小于他的数值剔除,再将他存入数组中。队列

      单调队列及单调栈的基础也就这些,剩下的就只剩下我的理解及练习了。推荐几道题,在大视野上的1012以及1047,其中1012比较裸适合初学者作,1047略有难度推荐作完1012后再作。(在这里给个提示,1047要用到两次单调队列、单调栈,横着一次再用结果竖这一次。)博客

       最后谢谢观看个人博客,但愿对你有所帮助。基础

相关文章
相关标签/搜索