907. 子数组的最小值之和

2023-11-05

907. 子数组的最小值之和

原始题目链接:https://leetcode.cn/problems/sum-of-subarray-minimums/

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

由于答案可能很大,因此 返回答案模 10^9 + 7 。

示例 1:

输入:arr = [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。
示例 2:

输入:arr = [11,81,94,43,3]
输出:444

解题思路:

统计每个元素作为最小值的连续子数组的个数,个数至少为1(元素本身作为子数组),所以遍历数组,统计个数然后加和。

代码实现:

class Solution:
    def sumSubarrayMins(self, arr: List[int]) -> int:
        # 单调栈:(当前元素,当前元素作为最小值的子数组个数)
        stack = []
        # 当前元素最小值对总和的增益
        count = 0
        res = 0

        # 遍历数组
        for num in arr:
            # 当前元素作为最小值的子数组个数至少为1,即子数组元素只有一个且为本身
            value = 1
            # 遍历栈,看当前元素是否比小于之前的元素
            # 如果有,则开始计算当前这个元素作为最小元素的所有子数组的和,
            # 则把元素弹出栈,因为使用了同一个变量count来存储相同元素的子数组的和,
            # 为了不重复,就需要减掉之前元素对总和的影响(清空count)
            # 把当前元素作为最小值的子数组个数+1
            while stack and num <= stack[-1][0]:
                pre_num, pre_count = stack.pop()
                count -= pre_count * pre_num
                value += pre_count

            stack.append((num, value))
            count += num * value
            res += count
            res %= 1000000007
            

        return res

参考文献:
https://leetcode.cn/problems/sum-of-subarray-minimums/solution/python3dan-diao-zhan-by-deyangdeyang-blge/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

907. 子数组的最小值之和 的相关文章

随机推荐

  • java new file会创建文件吗_Java高级——文件与I/O流

    简介 本文分为四个部分 首先是介绍File类 概括了一下概念 构造方法及常用方法等 其次是描述了面对对象的三大特征 再次是对抽象类进行了简单的概述 最后从特性 使用等等几个方面对接口进行了一定的描述 一 File类 1 File类概念 1
  • STM32F103系列控制的OLED IIC 4针

    最近在研究四针的OLED 先上个效果图 总工程文件评论区留下邮箱我会发送 硬件部分 有开发板的直接用开发板就好 没有的去某宝买一块STM32F103C8T6 10元左右 类似这种 接线部分 OLED一共有四个接口 本别是SCL 时钟 SDA
  • Qt-OpenCV学习笔记--高级形态转换--morphologyEx()

    概述 OpenCV提供了一个综合的形态转换工具 morphologyEx 集成了腐蚀运算 膨胀运算 开运算 闭运算 梯度运算 顶帽运算 黑帽运算 函数 void cv morphologyEx InputArray src OutputAr
  • 【云原生--Kubernetes】Helm 工具安装

    文章目录 一 Helm 概述 1 1 Helm 简介 1 2 Helm重要概念 1 3Helm2 组件 1 4Helm2 工作原理 1 5 Helm2与Helm3区别 二 Helm部署 三 Helm常用命令 3 1 chart仓库管理 3
  • 记5.28大促压测的性能优化—线程池相关问题

    目录 1 环境介绍 2 症状 3 诊断 4 结论 5 解决 6 对比java实现 废话就不多说了 本文分享下博主在5 28大促压测期间解决的一个性能问题 觉得这个还是比较有意思的 值得总结拿出来分享下 博主所服务的部门是作为公共业务平台 公
  • 【100天精通python】Day8:数据结构_元组Tuple的创建、删除、访问、修改、推导系列操作

    目录 1 创建元组 2 删除元组 3 访问元组元素 4 多个值的同时赋值和交换 5 修改元组元素 6 元组推导式 7 元组运算符 8 元组常用场景 9 元组 Tuple 和列表 List 的区别 元组 tuple 是 Python 中的一种
  • mysql创建表

    http www cnblogs com yunf archive 2011 04 20 2022193 html 说明 此文件包含了blog数据库中建立所有的表的Mysql语句 在sql语句中注意 约束的概念 1 实体完整性约束 主键 唯
  • 链栈的基本操作

    define CRT SECURE NO WARNINGS 链栈 include
  • bert下albert_chinese_small实现文本分类

    import torch from transformers import BertTokenizer BertModel BertConfig import numpy as np from torch utils import data
  • echarts设置时间轴timeline的长度

    使用timeline的 left right属性 设置时间轴距离左边和右边的距离即可
  • 用struts框架+正则表达式对数据进行校验

    创建文件名为XXX xxx validation xml XXX为Action类名 xxx为struct xml中对应的action配置的name名 并和该类放在同一个包中 校验文件部分代码如下 非字段型校验器
  • cesium 实现中文搜索定位

    cesium 实现根据中文搜索定位 天了噜 修改一下哦 高德地图获取的经纬度需要转一下哦 它是由偏移的啦 不是标准gps坐标 有接口 自行翻阅API 思路 利用高德的中文定位搜索获取选中定位的经纬度 cesium进行3D锚点定位 准备 申请
  • C语言 递归——n皇后

    递归算法 递归 递归的作用 n皇后 题目 代码 结果 递归 一个函数自己调用自己 递归和普通函数调用一样都是用栈来实现的 递归的作用 代替多重循环 将问题分解为规模更小的子问题再求解 解决本来就是用递归形式定义的问题 n皇后 题目 输入整数
  • 使用TortoiseGit操作分支的创建与合并

    第一步 创建本地分支 点击右键选择TortoiseGit 选择Create Branch 在Branch框中填写新分支的名称 若选中 switch to new branch 则直接转到新分支上 省去第二步 点击OK按钮 第二步 通过 Sw
  • 近阶段学习总结

    工作日志 要养成写工作日志的习惯 记录下每天的学习情况 包括新学的知识和每天的收获 要对每天新学的知识加以总结 让每一天的时间不至于白费 一定要总结 当天学到的新的知识点 尤其要反复更新和学习 才能举一反三 要专注于自己的事情 不要为外界的
  • 关于在使用Exchange2003系统时无法向sina,yahoo,hotmail等邮箱发送邮件问题的解决方法...

    先说普通的解决方法 转发 如果这些方法您已经用过还没有解决问题 请看本文章最后部分 该问题是由于反垃圾邮件软件引起的 已经和sina 确认过 他们最近部署了一套反垃圾邮件的系统在默认条件下 邮件服务器在发出helo命令与远端的邮件服务器通过
  • Nginx二级域名代理二级目录

    背景 今天做私单遇到一个很棘手的问题 甲方购买的是阿里云虚拟主机 众所周知虚拟主机虽然能绑定多个域名 但是只能指定一个根目录 也就是所有域名的访问都是指向到根目录 一共是开发了PC端 WAP端 管理端三个段 都要部署上去 用的vue cli
  • @Cacheable设置过期时间

    链接 https mp csdn net mp blog creation editor spm 1001 2101 3001 5352
  • Android开发者跳槽指南灵魂拷问

    前言 2020年是转折的一年 上半年疫情原因 很多学android开发的小伙伴失业了 虽找到了一份工作 但高不成低不就 下半年金九银十有想法更换一份工作 很多需要大厂面试经验和大厂面试真题的小伙伴 想提前准备刷下题 接下来分享一份我的字节跳
  • 907. 子数组的最小值之和

    907 子数组的最小值之和 原始题目链接 https leetcode cn problems sum of subarray minimums 给定一个整数数组 arr 找到 min b 的总和 其中 b 的范围为 arr 的每个 连续