2023-11-27 LeetCode每日一题(子数组的最小值之和)

2023-11-27每日一题

一、题目编号

复制代码
907. 子数组的最小值之和

二、题目链接

点击跳转到题目位置

三、题目描述

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

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

示例 1:

示例 2:

提示:

  • 1 <= arr.length <= 3 * 104
  • 1 <= arri <= 3 * 104

四、解题代码

cpp 复制代码
class Solution {
public:
    int sumSubarrayMins(vector<int>& arr) {
        int n = arr.size();
        long long ans = 0;
        long long mod = 1e9 + 7;
        stack<int> monoStack;
        vector<int> dp(n);
        for (int i = 0; i < n; i++) {
            while (!monoStack.empty() && arr[monoStack.top()] > arr[i]) {
                monoStack.pop();
            }
            int k = monoStack.empty() ? (i + 1) : (i - monoStack.top());
            dp[i] = k * arr[i] + (monoStack.empty() ? 0 : dp[i - k]);
            ans = (ans + dp[i]) % mod;
            monoStack.emplace(i);
        }
        return ans;
    }
};

五、解题思路

(1) 动态规划。

相关推荐
Ada's12 小时前
【计算机基础系列】003:Python数据结构
开发语言·数据结构·python
Nil20813 小时前
leetcode 118杨辉三角
算法·leetcode·职场和发展
wanderist.15 小时前
线性筛法详解:从筛质数到欧拉函数、Möbius 函数与约数函数
java·数据结构·算法
All for pursuit.16 小时前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode
weixin_3077791316 小时前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab
青少儿编程课堂16 小时前
背包问题(0/1 背包与完全背包)解题精讲——动态规划入门
c++·python·算法·bfs·信息学竞赛
光影少年17 小时前
为什么 JavaScript 中 0.1 + 0.2 !== 0.3,如何让其相等?
前端·javascript·算法
HEJOO917 小时前
Linux 设备驱动系列——使用全局工作队列
java·linux·算法
Code_Solitude17 小时前
c语言:递归
java·c语言·算法
程序员清风17 小时前
哈希表:从键值映射到高效查找
数据结构·哈希算法·散列表