力扣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;
      }
  };
相关推荐
点云SLAM1 小时前
二叉树算法详解和C++代码示例
数据结构·c++·算法·红黑树·二叉树算法
拼搏@1 小时前
第十六天,7月10日,八股
java·mybatis
Sylvia-girl5 小时前
Java——抽象类
java·开发语言
Touper.8 小时前
Redis 基础详细介绍(Redis简单介绍,命令行客户端,Redis 命令,Java客户端)
java·数据库·redis
m0_535064608 小时前
C++模版编程:类模版与继承
java·jvm·c++
今天背单词了吗9808 小时前
算法学习笔记:19.牛顿迭代法——从原理到实战,涵盖 LeetCode 与考研 408 例题
笔记·学习·算法·牛顿迭代法
虾条_花吹雪9 小时前
Using Spring for Apache Pulsar:Message Production
java·ai·中间件
tomorrow.hello9 小时前
Java并发测试工具
java·开发语言·测试工具
Moso_Rx9 小时前
javaEE——synchronized关键字
java·java-ee
jdlxx_dongfangxing9 小时前
进制转换算法详解及应用
算法