力扣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;
      }
  };
相关推荐
GY3509几秒前
C#中实现按位域操作
开发语言·算法·c#
起名字真南1 分钟前
【C语言】--操作符详解
c语言·开发语言·算法·visual studio
小小莴苣4 分钟前
Spring Boot中 CommandLineRunner 与 ApplicationRunner作用、区别
java·spring boot·后端
讓丄帝愛伱7 分钟前
Intellij Idea显示回退和前进按钮的方法
java·ide·intellij-idea
qq_25183645710 分钟前
1978Springboot在线维修预约服务应用系统idea开发mysql数据库web结构java编程计算机网页源码maven项目
java·数据库·intellij-idea
fengxingke14 分钟前
IDEA中SpringBoot项目数据库连接加密方法
java·ide·intellij-idea·jasypt·数据源加密
原来是大华啊~15 分钟前
idea导入文件里面的子模块maven未识别处理解决办法
java·开发语言·数据库
不称职的程序员❦17 分钟前
IDEA启动报错:Abnormal build process termination...
java·ide·intellij-idea·idea启动报错·abnormal build
敲上瘾23 分钟前
【排序算法】—— 希尔排序
数据结构·算法·排序算法
C++忠实粉丝23 分钟前
排序算法(1)之插入排序----直接插入排序和希尔排序
数据结构·算法·排序算法