本文介绍: 【力扣】907.子数组最小值之和

力扣】907.子数组最小值之和

1. 题目介绍

给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围arr每个连续)子数组

在这里插入图片描述

2. 解法

2.1 方法一:单调栈

维护两个单调栈,一个从前往后,一个从后往前,分别求出比当前数字大的左边数字个数右边数字个数,左右个数相乘即得到以当前数字为最小数的连续子数组的个数。然后累加即可得到结果

MOD = 10 ** 9 + 7

class Solution:
    def sumSubarrayMins(self, arr: List[int]) -> int:
        n = len(arr)
        monoStack = []
        left = [0] * n
        right = [0] * n
        for i, x in enumerate(arr):
            while monoStack and x <= arr[monoStack[-1]]:
                monoStack.pop()
            left[i] = i - (monoStack[-1] if monoStack else -1)
            monoStack.append(i)
        monoStack = []
        for i in range(n - 1, -1, -1):
            while monoStack and arr[i] < arr[monoStack[-1]]:
                monoStack.pop()
            right[i] = (monoStack[-1] if monoStack else n) - i
            monoStack.append(i)
        ans = 0
        for l, r, x in zip(left, right, arr):
            ans = (ans + l * r * x) % MOD
        return ans

2.2 方法二:动态规划

MOD = 10 ** 9 + 7

class Solution:
    def sumSubarrayMins(self, arr: List[int]) -&gt; int:
        n = len(arr)
        monoStack = []
        dp = [0] * n
        ans = 0
        for i, x in enumerate(arr):
            while monoStack and arr[monoStack[-1]] &gt; x:
                monoStack.pop()
            k = i - monoStack[-1] if monoStack else i + 1
            dp[i] = k * x + (dp[i - k] if monoStack else 0)
            ans = (ans + dp[i]) % MOD
            monoStack.append(i)
        return ans

3. Danger

力扣(LeetCode)是领扣网络旗下专注于程序员技术成长和企业技术人才服务品牌。源自美国硅谷,力扣为全球程序员提供了专业的IT技术职业化提升平台,有效帮助程序员实现快速进步和长期成长。此外,力扣(LeetCode)致力于解决程序技术评估、培训、职业匹配的痛点,逐步引领互联网技术求职和招聘迈向专业化。

参考

【1】https://leetcode.cn/problems/sum-of-subarrayminimums/solutions/1929461/zi-shu-zu-de-zui-xiao-zhi-zhi-he-by-leet-bp3k/?envType=daily-question&amp;envId=2023-11-27

原文地址:https://blog.csdn.net/qq_51392112/article/details/134652684

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_22668.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注