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,1,1,1,和爲 17。

 

提示:

  1. 1 <= A <= 30000
  2. 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);
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章