首页 > 其他分享 >lc907 子数组的最小值之和

lc907 子数组的最小值之和

时间:2024-03-17 14:13:53浏览次数:22  
标签:arr int back lc907 最小值 数组 empty

给定数组arr[n],求所有子数组中最小值的和,答案对1e9+7取模。
1<=n<=30000; 1<=arr[i]<=30000

考虑每个数作为最小值对应的子数组有多少个,计算对答案的贡献,而子数组的个数可以用单调栈来维护。数组元素可能相同,为了避免重复计数,用半开半闭区间。

class Solution {
public:
    int sumSubarrayMins(vector<int>& arr) {
        int n = arr.size();
        vector<int> L(n), R(n), s;
        for (int i = 0; i < n; i++) {
            while (!s.empty() && arr[i] < arr[s.back()])
                s.pop_back();
            L[i] = s.empty() ? -1 : s.back();
            s.push_back(i);
        }
        s.clear();
        for (int i = n-1; i >= 0; i--) {
            while (!s.empty() && arr[i] <= arr[s.back()])
                s.pop_back();
            R[i] = s.empty() ? n : s.back();
            s.push_back(i);
        }
        long long ans = 0;
        for (int i = 0; i < n; i++) {
            ans += 1LL * arr[i] * (i-L[i]) * (R[i]-i);
            ans %= 1000000007;
        }
        return ans;
    }
};

标签:arr,int,back,lc907,最小值,数组,empty
From: https://www.cnblogs.com/chenfy27/p/18078503

相关文章

  • 数组基础
    数组定义数组是一种容器,能存储同类型的多个值。Tip存储数据时,需要考虑隐式转换的问题例如:int(booleanbyteshortintdouble)其中double不能转换成boolean。建议具体数值与数据类型保持一致。静态初始化初始化:在内存中为数组容器开辟空间,并将数据存入容器......
  • 挖藏宝藏数组
    1 数组的概念数组是一组相同类型元素的集合,分为一维数组和多维数组,而多维数组中最常见的是二维数组。数组中存放的是1个或者多个数据,但是数组元素个数不能为0。 数组中存放的多个数据,类型是相同的。2 一维数组的创建和初始化2.1数组的创建一维数组创建的基本语法......
  • kmp算法next数组详解
             kmp算法是一项特别重要的算法,它的难点主要在于next数组的求解。##首先next[i]表示字符串下标i前子字符串(s[0~i-1])的最长相同前后缀的值。以字符串s="ababbacaba"为例子分析。前缀:aababaababababbababba ababbac ababbaca ababbacab后缀:aba......
  • lc2104 子数组的范围和
    给定数组nums[n],子数组的范围指子数组中最大元素与最小元素的差值,返回nums中所有子数组的范围之和。子数组是数组的连续非空序列。1<=n<=1000;-1e9<=nums[i]<=1e9分别考虑每个元素作为最小和最大值的情况,统计作为最小值的次数,作为最大值的次数,这个可以用单调栈求出,然后统计各位......
  • 第7讲:数组和函数实践:扫雷游戏
    第7讲:数组和函数实践:扫雷游戏1.扫雷游戏分析和设计1.1扫雷游戏的功能说明1.2游戏的分析和设计1.2.1数据结构的分析1.2.2文件结构设计2.扫雷游戏的代码实现3.扫雷游戏的扩展1.扫雷游戏分析和设计1.1扫雷游戏的功能说明•使用控制台实现经典的扫雷游戏•......
  • 大都市meg(线段树/树状数组+LCA)
    题目描述在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员BlueMary也开始骑着摩托车传递邮件了。不过,她经常回忆起以前在乡间漫步的情景。昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双向的土路。从每个村庄都恰好有一条路径到达村庄1(即比特堡)。并且......
  • LeetCode2024年3月14日每日一题(2789. 合并后数组中的最大元素)
    这里写目录标题单调栈代码的核心逻辑如下:单调栈单调栈是一种特殊的数据结构,它在算法设计中被广泛使用,尤其是在处理与栈相关的问题时,如括号匹配、最长有效括号子串、最小窗口子串等。单调栈的核心思想是栈内的元素保持某种单调性(递增或递减),这使得它在处理特定问题时比......
  • 输入8个整数元素存入数组中,再输入一个整数n,在数组中查找,找到了返回数组元素的下标,找不
    #include<stdio.h>intmain(){inti,n,arr[8];//Input8integerelementsintothearrayprintf("Enter8integerelements:\n");for(i=0;i<8;i++){scanf("%d",&arr[i]);}......
  • C#数组去重
    (1)去重int[]arr={1,4,3,1,6,5,6};int[]arr2=arr.Distinct().ToArray();for(inti=0;i<arr2.Length;i++){Console.WriteLine(arr2[i]);}Console.ReadKey();(2)//提取重复的int[]arr={1,4,3,1,6,5,6};......
  • 树状数组
    单点修改区间查询#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e7+5;#defineintlonglonginta[maxn],n,m;inlineintlowbit(intx){  returnx&(-x);}structnode{  inttr[maxn];  intadd(intx,inty)  {    for......