LeetCode题解(0907):计算数组的所有子数组的最小值之和(Python)

题目:原题链接(中等)

标签:栈、栈-单调栈、数组

解法时间复杂度空间复杂度执行用时
Ans 1 (Python) O ( N 2 ) O(N^2) O(N2) O ( N ) O(N) O(N)超出时间限制
Ans 2 (Python) O ( N ) O(N) O(N) O ( N ) O(N) O(N)540ms (72.83%)
Ans 3 (Python)

LeetCode的Python执行用时随缘,只要时间复杂度没有明显差异,执行用时一般都在同一个量级,仅作参考意义。

解法一(暴力解法):

def sumSubarrayMins(self, A: List[int]) -> int:
    ans = 0
    while A:
        ans += sum(A)
        ans = ans % (10 ** 9 + 7)
        B = []
        for i in range(len(A) - 1):
            B.append(min(A[i], A[i + 1]))
        A = B
    return ans

解法二(单调栈):

def sumSubarrayMins(self, A: List[int]) -> int:
    stack = []
    now = 0
    ans = 0  # 当前累加总和
    for i in range(len(A)):
        n = A[i]
        v = 1
        while stack and stack[-1][0] >= n:
            s = stack.pop()
            now -= s[0] * s[1]
            v += s[1]
        now += n * v
        stack.append([n, v])
        ans += now
    return ans
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页

打赏

长行

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者