力扣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;
      }
  };
相关推荐
Hello Dam8 分钟前
基于 FastExcel 与消息队列高效生成及导入机构用户数据
java·数据库·spring boot·excel·easyexcel·fastexcel
ShyTan10 分钟前
java项目启动时,执行某方法
java·开发语言
new一个对象_14 分钟前
poi处理多选框进行勾选操作下载word以及多word文件压缩
java·word
小刘|34 分钟前
数据结构的插入与删除
java·数据结构·算法
Clockwiseee1 小时前
JAVA多线程学习
java·开发语言·学习
廖显东-ShirDon 讲编程1 小时前
《零基础Go语言算法实战》【题目 2-22】Go 调度器优先调度问题
算法·程序员·go语言·web编程·go web
Lulsj2 小时前
代码随想录day24 | 贪心算法理论基础 leetcode 455.分发饼干 376.摆动序列 53. 最大子序和
算法·leetcode·贪心算法
KuaCpp2 小时前
算法初学者(图的存储)链式前向星
c++·算法
Cosmoshhhyyy2 小时前
LeetCode:2270. 分割数组的方案数(遍历 Java)
java·算法·leetcode
zhulangfly2 小时前
【Java设计模式-4】策略模式,消灭if/else迷宫的利器
java·设计模式·策略模式