[907] 子數(shù)組的最小值之和

鏈接:子數(shù)組的最小值之和

這題如果用動態(tài)規(guī)劃方法求解智润,復(fù)雜度O(n^2)苟跪,在給定的數(shù)據(jù)規(guī)模下挪蹭,肯定超時(shí)已添。

轉(zhuǎn)變思路忌穿,計(jì)算數(shù)組中的第i個(gè)元素arr[i]可以作為多少個(gè)子數(shù)組的最小值笙隙,這個(gè)數(shù)量記為T_i,那么arr[i]提供的子數(shù)組最小值和就是arr[i] * T_i隔心。然后遍歷一遍arr白群,就能求出本題的答案了。

那么問題就變成了怎么計(jì)算T_i了硬霍,加入arr[i]左邊有3個(gè)數(shù)小于arr[i]帜慢,arr[i]右邊有1個(gè)數(shù)小于arr[i],那么這種情況下的T_i=(3+1)*(1+1)=8唯卖×涣幔可以看出,只要找到arr[i]左右兩邊第一個(gè)小于arr[i]的數(shù)的位置拜轨。

這個(gè)問題如果用遍歷試探去找的話抽减,復(fù)雜度還是O(n^2)還是會超時(shí),這里介紹單調(diào)棧方法撩轰,可以棧O(n)的復(fù)雜度內(nèi)計(jì)算出左邊最近的小于arr[i]的數(shù)(的位置)胯甩。

  1. 對于當(dāng)前遍歷的元素arr[i],觀察棧頂?shù)脑乜吧绻麠m數(shù)脑卮笥甑扔诋?dāng)前元素偎箫,就把棧頂元素出棧,重復(fù)這個(gè)過程皆串,直到棧為空或者棧頂元素小于當(dāng)前元素淹办,這樣我們就找到了arr[i]左邊第一個(gè)比arr[i]小的數(shù)(位置)了。
  2. 然后再把arr[i]入棧恶复,由于之前棧為空或者棧頂元素小于arr[i]怜森,這樣棧還保持單調(diào)遞增的性質(zhì)。
class Solution:
    def sumSubarrayMins(self, arr: List[int]) -> int:
        n = len(arr)
        base = 10**9+7
        res = 0
        stack = []
        prev = [0]*n
        next = [0]*n
        for i in range(n):
            while stack and arr[i] < stack[-1][0]:
                stack.pop()
            
            prev[i] = stack[-1][1] if stack else -1
            stack.append([arr[i], i])

        stack = []
        for i in reversed(range(n)):
            while stack and arr[i] <= stack[-1][0]:
                stack.pop()
            
            next[i] = stack[-1][1] if stack else n
            stack.append([arr[i], i])
        
        # print(prev)
        # print(next)
        for i in range(n):
            res = (res + arr[i] * (i-prev[i])*(next[i]-i)) % base
        return res

總結(jié):

單調(diào)棧的本質(zhì):快速找到左邊谤牡、右邊最近的大于或小于自身的值(或位置)副硅。
如果要找最近小于自身的數(shù)(位置),使用單調(diào)遞增棧翅萤,棧頂小于自身就是結(jié)果恐疲。
如果要找最近大于自身的數(shù)(位置),使用單肩遞減棧套么,棧頂大于自身就是結(jié)果培己。

單調(diào)隊(duì)列的本質(zhì):在運(yùn)行的過程中,能夠快速找到前K個(gè)或后K個(gè)中的最值胚泌。
能夠維護(hù)一個(gè)區(qū)間的最值省咨,這個(gè)區(qū)間的兩個(gè)下標(biāo)在運(yùn)行過程中,都是往右跑玷室,不會往左跑零蓉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笤受,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子敌蜂,更是在濱河造成了極大的恐慌感论,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紊册,死亡現(xiàn)場離奇詭異比肄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)囊陡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門芳绩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人撞反,你說我怎么就攤上這事妥色。” “怎么了遏片?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵嘹害,是天一觀的道長。 經(jīng)常有香客問我吮便,道長笔呀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任髓需,我火速辦了婚禮许师,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘僚匆。我一直安慰自己微渠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布咧擂。 她就那樣靜靜地躺著逞盆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪松申。 梳的紋絲不亂的頭發(fā)上云芦,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音攻臀,去河邊找鬼焕数。 笑死纱昧,一個(gè)胖子當(dāng)著我的面吹牛刨啸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播识脆,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼设联,長吁一口氣:“原來是場噩夢啊……” “哼善已!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起离例,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤换团,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后宫蛆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艘包,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年耀盗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了想虎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叛拷,死狀恐怖舌厨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忿薇,我是刑警寧澤裙椭,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站署浩,受9級特大地震影響揉燃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筋栋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一你雌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧二汛,春花似錦婿崭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至婿着,卻和暖如春授瘦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竟宋。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工提完, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丘侠。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓徒欣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜗字。 傳聞我的和親對象是個(gè)殘疾皇子打肝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容