首页 > 其他分享 >lc2104 子数组的范围和

lc2104 子数组的范围和

时间:2024-03-17 11:12:42浏览次数:26  
标签:lc2104 nums int back long vector 数组 范围

给定数组nums[n],子数组的范围指子数组中最大元素与最小元素的差值,返回nums中所有子数组的范围之和。子数组是数组的连续非空序列。
1<=n<=1000; -1e9<=nums[i]<=1e9

分别考虑每个元素作为最小和最大值的情况,统计作为最小值的次数,作为最大值的次数,这个可以用单调栈求出,然后统计各位置对答案的贡献。由于数组中可能存在相同元素,为了避免重复统计,使用左闭右开区间。

class Solution {
public:
    long long subArrayRanges(vector<int>& nums) {
        int n = nums.size();
        vector<int> Min(n), Max(n);

        auto getCnt = [&](int isMin, vector<int> &ret) {
            vector<int> L(n), R(n);
            vector<int> s;
            for (int i = 0; i < n; i++) {
                while (!s.empty() && (isMin ? nums[s.back()] >= nums[i] : nums[s.back()] <= nums[i]))
                    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() && (isMin ? nums[i] < nums[s.back()] : nums[i] > nums[s.back()]))
                    s.pop_back();
                R[i] = s.empty() ? n : s.back();
                s.push_back(i);
            }
            for (int i = 0; i < n; i++) {
                ret[i] = 1LL * (i-L[i]) * (R[i]-i);
            }
        };

        getCnt(1, Min);
        getCnt(0, Max);
        long long ans = 0;
        for (int i = 0; i < n; i++) {
            ans += 1LL * nums[i] * (Max[i] - Min[i]);
        }
        return ans;
    }
};

标签:lc2104,nums,int,back,long,vector,数组,范围
From: https://www.cnblogs.com/chenfy27/p/18078332

相关文章

  • c++中 int, long long, double 等数据类型的长度及范围整理
    原文链接:https://blog.csdn.net/mmk27_word/article/details/84378346byte:字节bit:位短整型short:所占内存大小:2byte=16bit;所能表示范围:-3276832767;(即-2^152^15-1)整型int:所占内存大小:4byte=32bit;所能表示范围:-21474836482147483647;(即-2^312^31-1)unsigned:所......
  • 第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......
  • LeetCode 992. K 个不同整数的子数组
    解题思路举一个例子可能会比较好理解nums=[1,2,1,2,3],k=2i表示的是右指针,j表示的是左指针。i=3时,需要求出符合子数组中含有k个不同整数,此时的j1=0需要求出符合子数组中含有k-1个不同整数,此时的j2=1j1~j2之间就是符合子数组中含有k个不同整数的子数组个数。相......
  • 指针数组、数组指针、函数指针、指针函数
    数组指针:是指向数组的指针,它还是一个指针,只不过指向数组而已行指针定义形式:int(*p)[10]一定要加(),因为[]优先级高于*,所以必须要(*p)指一行,这里10为列的元素个数例1:二维数组数值为1-12,用行指针定义输出8例2:用行指针传参,2*3数组,输出第二行指针数组:实际是一个数组,长度是......
  • 函数指针数组(转移表)
    函数指针数组,首先是一个数组,其次其中存储的数据类型是函数指针,所以我们可以通过使用函数指针数组来调用不同的函数。接下来为大家展示他的基本使用方法(模拟计算器)函数指针数组结构   int(*arr[])(intx,inty)={NULL,Add,Sub,Mul,Div};其中NULL,Add,Sub,Mul,Div......