leetcode 第907題 子數組的最小值之和 python解法

leetcode 第907題 子數組的最小值之和 python解法

問題分析

問題如下(傳送門),題目的意思是將數組所有的連續子數組找到,然後將所有子數組中的最小值找到並求和。
在這裏插入圖片描述
最簡單的方法就是找到所有的子數組,然後得到最小值和。但這樣最後肯定會超時的,不予考慮。
題目的提示是用棧來做這個題目,所以先往這方向上想。進一步分析,假設從數組的頭部遍歷,如果後面的數大於前面的數。那麼這兩個數構成的子數組取得肯定是前面的小的數;如果後面的數小於前面的數,那麼子數組就得取後面的數。
那麼先建立一個棧,這個棧中的元素是遞增的,此外還建立一個輔助棧,這個棧主棧同時出入棧,大小保持一致。輔助棧每個元素包含兩個數,第一個數是原數組在該元素前所有元素與此元素構成的子數組最小值和,第二個數就是此元素在原數組中前面連續小於它的數的個數。
以數組[]2, 4, 5, 3, 6]來做例子。剛開始爲了保證棧不爲空,所以先在棧中加入了0(原數組的所有數大於0)。那麼2,4,5都是遞增的所以直接加入主棧。在輔助棧中,2加入,與前面(實際上沒有)元素構成的子數組最小值和爲2,第二個加入4,它可以與2構成子數組,但該子數組只能取2,最後還有自己單獨構成的數組4。所以
num+stackData[-1][0] (num爲此刻遍歷到的數)即4+2= 6,同樣加入5。至此總體的情況如下:
在這裏插入圖片描述

接下來加入3,此時棧頂元素大於3,所以這兩個數構成的子數組最終取3,記錄下此時小於3的個數count+stackData[-1][1] = 2(count初始值爲1),隨後主棧和輔助棧都將棧頂元素出棧;接下來主棧棧頂爲4,仍舊大於3,於是與上面同樣的操作。最後棧頂元素爲2,小於3,因此不用出棧。後面要做的就是計算3這個位置與前面所有數組構成的子數組的最小值和。此刻count=3,代表着構成的子數組中最小值是3的數組的個數(分別爲3;5,3;4,5,3),所以這些數組和爲countnum = 33 = 9。除此之外,2包括2之前的數都可以與3組成子數組,但是由於2的存在,所以構成的子數組都會收到2的影響(但是這裏面最小的數可能不是2,假如我們的數組足夠長而且2之前有比2小的數,但是這裏不用管這些,因爲所有的影響都歸入到dataData[-1][0])。那麼最後就將9+dataData[-1][0]。
在這裏插入圖片描述
最後是6,6大於2,那就和之前的3,4,5同樣操作入棧。
這裏要注意的是在遍歷的過程中,將每個元素與該元素之前所有元素組成的子數組和加上返回值,即將遍歷過程中的dataData[-1][0]累加。

別人的解法

後來我看了人家的解法,真是人比人得死, 貨比貨得扔,不僅用時更短,佔有的內存也更少(哎,希望我以後也能這麼厲害吧╮(╯▽╰)╭)。後來想了下我的解法改進一下就和他們的差不多吧= ̄ω ̄=。這是幾個解法的鏈接,大家有興趣可以看看:
1、Leetcode上被人點贊最多的解答
2、感覺最好的解答

源碼

class Solution:
    def sumSubarrayMins(self, A):
        # 自己寫的
        ret = 0
        stackNum = [0]
        stackData = [[0,0]]
        for num in A:
            count = 1
            if num > stackNum[-1]:
                totalSum = num + stackData[-1][0]
            else:
                while stackNum and stackNum[-1] >= num:
                    count += stackData[-1][1]
                    del stackData[-1]               
                    del stackNum[-1]                
                totalSum = num * count + stackData[-1][0]
            stackData.append([totalSum, count])
            stackNum.append(num)
            ret += totalSum
        return ret % (10 ** 9 + 7)

謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章