給定一個整數數組 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 <= 30000
1 <= A[i] <= 30000
分析:
遍歷數組,分析數組元素A[i]爲子數組最小時,A[i]的左邊可能的最長的長度l1(包括A[i])以及右邊可能的最長的長度l2(包括A[i]),則在所有的子數組中,以a[i]爲最小值得數組個數爲l1*l2.
代碼:
public class LeetCode907 {
public static void main(String[] args) {
int[] A={3,1,2,4};
System.out.println(sumSubarrayMins(A));
}
public static int sumSubarrayMins(int[] A) {
long res = 0;
long mod = 1000000007;
int left,right;
for(int i = 0; i < A.length; i++){
for( left = i - 1;left >= 0 && A[i] < A[left]; left--) ;// 向左可延伸多少個子數組(min)
for(right = i + 1 ; right < A.length && A[i] <= A[right]; right++) ; // 向右可延伸多少個子數組(min)
res += (i - left) * (right- i) * A[i]; // 當前 A[i]在多少個子數組中最小
}
return (int)(res % mod);
}
}