907 子陣列的最小值之和

2021-09-11 06:05:39 字數 2139 閱讀 5154

碰到leetcode907,子陣列的最小值之和,用python3按自己思路寫死都過不去,怎麼都超時,這是python3**:

class solution:

def sumsubarraymins(self, a):

""":type a: list[int]

:rtype: int

"""res = 0

length = len(a)

for i in range(length):

left = 0

right = 0

if i > 0:

j = i - 1

while j >= 0 and a[j] > a[i]:

left += 1

j -= 1

if i < length - 1:

k = i + 1

while k < length and a[k] >= a[i]:

k += 1

right += 1

res += a[i] * (left * right + (left + right + 1))

return res % (10**9 + 7)

按這思路,cpp寫提交勉強通過,時間和記憶體讓人哭笑不得

可**思路沒咋明白,先做馬來人,日後再見!

220ms**:

class solution:

def sumsubarraymins(self, a):

""":type a: list[int]

:rtype: int

"""mod = 10**9 + 7

stack =

ans = dot = 0

for j, y in enumerate(a):

# add all answers for subarrays [i, j], i <= j

count = 1

while stack and stack[-1][0] >= y:

x, c = stack.pop()

count += c

dot -= x * c

dot += y * count

ans += dot

return ans % mod

440ms**:

class solution:

def sumsubarraymins(self, a):

""":type a: list[int]

:rtype: int

"""mod = 10**9 + 7

n = len(a)

# prev has i* - 1 in increasing order of a[i* - 1]

# where i* is the answer to query j

stack =

prev = [none] * n

for i in range(n):

while stack and a[i] <= a[stack[-1]]:

stack.pop()

prev[i] = stack[-1] if stack else -1

# next has k* + 1 in increasing order of a[k* + 1]

# where k* is the answer to query j

stack =

next_ = [none] * n

for k in range(n-1, -1, -1):

while stack and a[k] < a[stack[-1]]:

stack.pop()

next_[k] = stack[-1] if stack else n

# use prev/next array to count answer

return sum((i - prev[i]) * (next_[i] - i) * a[i]

for i in range(n)) % mod

這是**原址:

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...

LeetCode 907 子陣列的最小值之和

給定乙個整數陣列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...

LeetCode 907 子陣列的最小值之和

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