JavaScript刷LeetCode -- 907. Sum of Subarray Minimums
阿新 • • 發佈:2018-12-23
一、題目
Given an array of integers A, find the sum of min(B), where B ranges over every (contiguous) subarray of A.
Since the answer may be large, return the answer modulo 10^9 + 7.
- 1 <= A.length <= 30000
- 1 <= A[i] <= 30000
二、題目大意
對於給定的整型陣列A,找出A的所有子陣列,輸出這些子陣列中最小值的和。(值可能非常的大,需要對10^9+7取模運算)
三、解題思路
這道題很容易想出的思路就是找出所有的組合, 然後求解最小值的和:
const sumSubarrayMins = A => { const max = A.length const MAX = 10 ** 9 + 7 let ans = 0 for (let i = 0; i < max; i++) { let end = i let min = Number.MAX_SAFE_INTEGER while (end >= 0) { min = Math.min(min, A[end]) ans = (ans + min) % MAX end-- } } return ans % MAX }
但是由於陣列A的長度限制,這種方法一定會超時。這時就需要轉化一下思路:
# 以 [3, 1, 2, 4] 為例
# 找出所有組合的最小值為1的情況:
[3, 1]
[1]
[3, 1, 2]
[1, 2]
[1, 2, 4]
[3, 1, 2, 4]
那麼只要算出以1為最小值的組合的個數即可:
# 首先找出1左邊可以和其結合的元素 left = [3] # 再找出1右邊可以和其結合的元素 right = [2, 4] # 那麼以1為最小值的組合的個數為: count = len(left) + len(right) + len(left) * len(right) + 1
四、程式碼實現
const sumSubarrayMins1 = A => {
const MAX = 10 ** 9 + 7
const max = A.length
let ans = 0
const left = []
for (let i = 0; i < max; i++) {
let end = i
const item = A[i]
while (--end >= 0) {
if (A[end] >= item) {
continue
} else {
break
}
}
left[i] = i - end - 1
}
const right = []
for (let i = 0; i < max; i++) {
let end = i
const item = A[i]
while (++end < max) {
if (A[end] > item) {
continue
} else {
break
}
}
right[i] = end - i - 1
}
for (let i = 0; i < max; i++) {
const l = left[i]
const r = right[i]
ans = (ans + ((l + r + l * r + 1) * A[i]) % MAX) % MAX
}
return ans
}
如果本文對您有幫助,歡迎關注我的微信公眾號【超愛敲程式碼】,為您推送更多內容,ε=ε=ε=┏(゜ロ゜;)┛。