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

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

  • 考虑每个数对答案的贡献

    • 对于每个元素 找到左边界(严格小于)
      • 右边界(小于等于)
    • 这样出现重复元素也不会重复计算答案
    • 对于答案贡献为 arr[i] * (i - l) * (r - i)
cpp 复制代码
  class Solution {
      const int MOD = 1e9+7;
  public:
      int sumSubarrayMins(vector<int>& arr) {
          int n = arr.size();
          vector<int> l(n,-1),r(n,n);
          stack<int> st;
          for(int i=0;i<n;i++)
          {
              while(!st.empty() && arr[st.top()] >= arr[i]) st.pop();
              if(!st.empty()) l[i] = st.top();
              st.push(i);
          }
  
          st = stack<int>();
          for(int i=n-1;i>=0;i--)
          {
              while(!st.empty() && arr[st.top()] > arr[i]) st.pop();
              if(!st.empty()) r[i] = st.top();
              st.push(i);
          }
  
          long res=0L;
          for(int i=0;i<n;i++)
          {
              res += (long)arr[i] * (i - l[i]) * (r[i] - i);
          }
          return res % MOD;
      }
  };
相关推荐
DeepModel2 分钟前
机器学习数据预处理:特征构造
人工智能·学习·算法·机器学习
ATCH IERV2 分钟前
Redis6.2.6下载和安装
java
棋子入局5 分钟前
C语言实现消消乐游戏(6)
c语言·算法·游戏
wechatbot8886 分钟前
企业微信全场景消息发送接口开发实现及接口调用
java·汇编·微信·企业微信
2501_9130613410 分钟前
网络原理之HTTP(3)
java·网络·网络协议·http·面试
Mem0rin12 分钟前
[Java]排序
java·算法·排序算法
番茄去哪了13 分钟前
JeecgBoot框架集成spring ai并进行同步调用异步调用模板
java·人工智能·spring
京师20万禁军教头17 分钟前
30面向对象(中级)-super关键字
java
likerhood26 分钟前
Java 中的 `clone()` 与 `Cloneable` 接口详解
java·开发语言·python
DavidSoCool26 分钟前
Springboot AI 创建MCP Server
java·spring·ai·大模型·springboot·mcp