LeetCode 907 子陣列的最小值之和

2021-08-28 11:38:23 字數 1548 閱讀 2071

給定乙個整數陣列a,找到min(b)的總和,其中b的範圍為a的每個(連續)子陣列。

由於答案可能很大,因此返回答案模10^9 + 7

示例:

輸入:[3,1,2,4]

輸出:17

解釋:子陣列為 [3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。

最小值為 3,1,2,4,1,1,2,1,1,1,和為 17。

1 <= a <= 300001 <= a[i] <= 30000

歸納法可以直到每個元素a[i]被加入到最終結果的次數為其左鄰居中大於它、右鄰居中不小於它的元素長度leftright(包括自身)的乘積。

示例:[3,1,2,4]元素

left

right31

1123

2124

11上邊每一行相乘的結果累加得到結果17

因此原問題轉換成尋找每個元素的leftright值。逐個判斷,會超時。因此使用陣列記錄左側元素的left值和右側元素的right值。

對當前元素a[i],如果a[i]>=a[i-1],那麼left[i]=1;反之,a[i]另一側同理。

def fun(a):

""":type a: list[int]

:rtype: int

"""ans = 0

maxindex = len(a) - 1

left =

right =

for i in range(0, maxindex + 1):

numleft = 1

while i - numleft >= 0 and a[i - numleft] > a[i]:

numleft += left[i - numleft]

numright = 1

while maxindex - i + numright <= maxindex and a[maxindex - i + numright] >= a[maxindex - i]:

numright += right[i - numright]

for i in range(0, maxindex + 1):

ans += left[i] * right[maxindex - i] * a[i]

return ans % 1000000007

LeetCode 907 子陣列的最小值之和

這裡是題目描述 leetcode 907.子陣列的最小值之和 本題給定乙個整數陣列a,求a的所有 連續 子陣列的最小值的和,直觀上可以用暴力法 列出a的所有子陣列,分別求出這些子陣列的最小值,再分別將這些最小值相加。但是通過分析時間複雜度 列舉出所有子陣列需要o n2 的時間複雜度,求乙個子陣列的最...

907 子陣列的最小值之和

碰到leetcode907,子陣列的最小值之和,用python3按自己思路寫死都過不去,怎麼都超時,這是python3 class solution def sumsubarraymins self,a type a list int rtype int res 0 length len a for...

907 子陣列的最小值之和

題目描述 給定乙個整數陣列 arr,找到 min b 的總和,其中 b 的範圍為 arr 的每個 連續 子陣列。由於答案可能很大,因此 返回答案模 10 9 7 示例 1 輸入 arr 3,1,2,4 輸出 17 解釋 子陣列為 3 1 2 4 3,1 1,2 2,4 3,1,2 1,2,4 3,1...