算法题:Every Sublist Min Sum

发布于 2023-10-21 14:52:58 字数 2090 浏览 24 评论 0

题目描述

You are given a list of integers nums. Return the sum of min(x) for every sublist x in nums. Mod the result by 10 ** 9 + 7.

Constraints

n ≤ 100,000 where n is the length of nums
Example 1
Input
nums = [1, 2, 4, 3]
Output
20
Explanation
We have the following sublists and their mins:

min([1]) = 1
min([1, 2]) = 1
min([1, 2, 4]) = 1
min([1, 2, 4, 3]) = 1
min([2]) = 2
min([2, 4]) = 2
min([2, 4, 3]) = 2
min([4]) = 4
min([4, 3]) = 3
min([3]) = 3

题目地址

https://binarysearch.com/problems/Every-Sublist-Min-Sum

前置知识

  • 单调栈

公司

  • 暂无

单调栈

思路

我们可以枚举得到答案。具体的枚举策略为:

  • 假设以索引 0 的值为最小值且包含索引 0 的子数组个数 c0。 其对答案的贡献为 c0 * nums[0]
  • 假设以索引 1 的值为最小值且包含索引 1 的子数组个数 c1。 其对答案的贡献为 c1 * nums[1]
  • 。。。
  • 假设以索引 n-1 的值为最小值且包含索引 n-1 的子数组个数 cn。其对答案的贡献为 cn * nums[n-1]

上述答案贡献之和即为最终答案。

接下来我们考虑分别如何计算上面的子贡献。

使用单调栈可以很容易地做到这一点,因为单调栈可以回答下一个(上一个)更小(大)的元素的位置这个问题。

对于 i 来说,我们想知道下一个更小的位置 r ,以及上一个更小的位置 l。 这样 i 对答案的贡献就是 (r-i)*(i-l)*nums[i]

代码上,我们处理到 i 的时候,不是计算 i 对答案的贡献,而是计算出从栈中弹出来的索引 last 对答案的贡献。这可以极大的简化代码。具体见下方代码区。

为了简化逻辑判断,我们可以使用单调栈常用的一个技巧:虚拟元素。这里我们可以往 nums 后面推入一个比所有 nums 的值都小的数即可。

关键点

  • 分别计算以每一个被 pop 出来的为最小数的贡献

代码

代码支持:Python

Python3 Code:


class Solution:
    def solve(self, nums):
        nums += [float('-inf')]
        mod = 10 ** 9 + 7
        stack = []
        ans = 0

        for i, num in enumerate(nums):
            while stack and nums[stack[-1]] > num:
                last = stack.pop()
                left = stack[-1] if stack else -1
                ans += (i - last) * (last - left) * nums[last]
            stack.append(i)
        return ans % mod

复杂度分析

令 n 为 nums 长度

  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(n)$

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

不醒的梦

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

金兰素衣

文章 0 评论 0

ゃ人海孤独症

文章 0 评论 0

一枫情书

文章 0 评论 0

清晰传感

文章 0 评论 0

mb_XvqQsWhl

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文