前言
长路漫漫,学习好累,本题依旧是单调栈,还是有点不熟练,可能思考不够,题解还挺巧妙
题目
源码
class Solution:
def sumSubarrayMins(self, A: List[int]) -> int:
MOD = 10**9 +7
ans=tmp=0
stack=[(float('-inf'),float('-inf'))]
for i in range(len(A)):
cnt=1
while stack and A[i]<stack[-1][0]:
cur=stack.pop()
cnt += cur[1]
# 弹出时,表明栈的数字已经大于当前数字,这样才可以以计算出当前数字为最小的子序列
tmp -= cur[0]*cur[1]
stack.append((A[i],cnt))
tmp += A[i]*cnt
ans += tmp
ans %= MOD
return ans
class Solution {
int MOD=1000000007;
public int sumSubarrayMins(int[] A) {
int ans=0,tmp=0;
Stack<Pair> stack=new Stack();
for(int i=0;i<A.length;++i){
int cnt=1;
while(!stack.isEmpty() && A[i]<stack.peek().val){
Pair cur =stack.pop();
cnt+=cur.cnt;
tmp -= cur.val*cur.cnt;
}
stack.push(new Pair(A[i],cnt));
tmp += A[i]*cnt;
ans += tmp;
ans %= MOD;
}
return ans;
}
class Pair{
public int val;
public int cnt;
public Pair(int val,int cnt){
this.val=val;
this.cnt=cnt;
}
}
}