JAVA程序设计:子数组的最小值之和(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 <= A <= 30000
1 <= A[i] <= 30000

思路:单调栈的经典应用。

不懂单调栈的可以看我这篇博客。

另一道题的方法三和这道题解法类似:链接。

class Solution {
    public int sumSubarrayMins(int[] A) {
    	
    	long ans=0;
    	int mod=1000000007;
    	Stack st=new Stack<>();
    	
    	st.add(-1);
    	
    	for(int i=0;i=A[i]) {
    			int index=st.pop();
    			int q=i-index;
    			int p=index-st.peek();
    			ans=(ans+A[index]*p%mod*q%mod)%mod;
    		}
    		st.add(i);
    	}
    	
    	while(st.peek()!=-1) {
    		int index=st.pop();
    		int q=A.length-index;
    		int p=index-st.peek();
    		ans=(ans+A[index]*p%mod*q%mod)%mod;
    	}
    	
    	return (int)ans;
    }
}

 

你可能感兴趣的:(JAVA程序设计:子数组的最小值之和(LeetCode:907))