初談這個話題,相信許多人會有一種似有所悟,但又不敢肯定的感受。沒錯,這正是由於其中「單調」一詞的存在,所謂單調是什麼,學過函數的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要用到兩次單調隊列、單調棧,橫着一次再用結果豎這一次。)博客
最後謝謝觀看個人博客,但願對你有所幫助。基礎