碰到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 的時間複雜度,求乙個子陣列的最...