首页 > 其他分享 >子数组最小值(单调栈)

子数组最小值(单调栈)

时间:2025-01-11 11:13:05浏览次数:1  
标签:arr cur int long st 最小值 数组 ans 单调

题目链接:https://leetcode.cn/problems/sum-of-subarray-minimums/

题意:

给定一个数组,让你求子数组最小值的和,复杂度O(N)

思路:

单调栈(获得每个位置左边比它小且离它最近的数,右边比它小且离它最近的数,那么在这之间它本身就是区间最小值)

class Solution {
public:
    int sumSubarrayMins(vector<int>& arr) {
        long long mod=1000000000+7;
        int st[30005];
        int ans[30005][2];
        int n=arr.size();
        int r=0,cur;
        for(int i=0;i<n;i++)
        {
            while(r>0&&arr[st[r-1]]>=arr[i])
            {
                cur=st[--r];
                ans[cur][0]=r>0?st[r-1]:-1;
                ans[cur][1]=i;
            }
            st[r++]=i;
        }
        while(r>0)
        {
            cur=st[--r];
            ans[cur][1]=n;
            ans[cur][0]=r>0?st[r-1]:-1;
        }
        long long res=0;
        for(int i=0;i<n;i++)
        {
            res=(res+(long long)arr[i]*(i-ans[i][0])*(ans[i][1]-i))%mod;//同余定理(重要)(每两数相加再取模=一群数相加取模)
        }
        return res;
    }
};

标签:arr,cur,int,long,st,最小值,数组,ans,单调
From: https://www.cnblogs.com/benscode/p/18665385

相关文章

  • 嵌入式C语言:二维数组
    目录一、二维数组的定义二、内存布局2.1.内存布局特点2.2.内存布局示例2.2.1.数组元素地址2.2.2.内存布局图(简化表示)2.3.初始化对内存布局的影响三、访问二维数组元素3.1.常规下标访问方式3.2.通过指针访问3.2.1.指向数组首元素的指针3.2.2.指向单行元素......
  • Java学习,数组转集合
    Java中将数组转换为集合(例如 List)是一项常见的操作。Java提供了多种方法来实现这一功能,其中最简单和常用的方法是使用 java.util.Arrays 类和 java.util.Collections 类中的静态方法。数组转集合,示例:importjava.util.List;importjava.util.ArrayList;importjava.u......
  • LeetCode:349.两个数组的交集
    集合是什么?一种无序且唯一的数据结构。ES6中有集合,名为Set。集合的常用操作:去重、判断某元素是否在集合中、求交集letarr=[1,2,2,4,5,6,7,8,9,10]letunRepeat=[...newSet(arr)]console.log(unRepeat)letset1=newSet([1,2,3])letset2=newSet([3,4,5])console.log(se......
  • 每日温度(单调栈)
    题目链接:https://leetcode.cn/problems/daily-temperatures/题意:给你一个每日气温数组,请你确定每个位置右边是否比自己大的元素,如果无,返回0。否则,返回两者下标之差思路:单调栈(这就好似给了数组中每个位置做波峰或波谷的机会)(ps:单调栈一定存的是下标i)classSolution{public......
  • 单调栈板子
    单调栈用于求解数组每个位置上左边/右边离自己最近的且严格小于/大于自己位置上的数的位置时间复杂度O(N)(每个元素下标进栈一次出栈一次)元素下标能表示的含义比元素本身要多(ps:注意数组长度,过大就要开到全局变量中,否则异常退出orz)方法(求每个位置上离自己最近且严格小于自己......
  • JAVA-Day 12:数组的动态初始化和遍历
    数组的动态初始化和遍历数组的动态初始化格式为:inta[]=newint[10];a[0]=4;a[1]=5;例:for(inti=0;i<2;i++){System.out.println(a[i]);}代码运行结果如下雨所示:![数组的动态初始化运行结果](file://C:\Users\小王同......
  • JAVA-Day 11:数组的静态初始化和遍历
    数组的静态初始化和遍历数组静态初始化格式数组的静态初始化与遍历完整格式:数据类型[]数组名=new数据类型[]{元素1,元素2,元素3,....}简化格式:数据类型[]数组名={元素1,元素2,元素3,....}[]在数组名前后都可以代码如下:intnumber[]={1,2,3,4,5};for(inti=0;......
  • Golang笔记——切片与数组
    本文详细介绍Golang的切片与数组,包括他们的联系,区别,底层实现和使用注意事项等。文章目录数组与切片的异同相同之处区别切片(Slice)源码解析Go源码中`len()`和`cap()`定义长度与容量示例`append()`函数Go切片扩容机制基本原理扩容策略(依据Go版本)扩容源码解......
  • JAVA数组
    1、数组定义:是一种容器,可以用来存储同种数据类型的多个值。数据容器在存储容器的时候,需要结合隐式转换考虑。建议:容器的类型和存储的数据类型保持一致。2、数组格式:一、数据类型[]数组名二、数据类型数组名[]3、数组初始化:初始化:就是在内存中,为数组容器开辟容器,......
  • 子数组最大累加和
    [Algo]子数组最大累加和1.最大子数组和i//1.最大子数组和i//https://leetcode.cn/problems/maximum-subarray/description/intmaxSubArray(vector<int>&nums){vector<int>dp(nums.size());//dp[i]-以i位置作为结尾的最大子数组和dp[0]=nums[0];......