文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给你一个整数数组 nums 。nums 中,子数组的 范围 是子数组中最大元素和最小元素的差值。

返回 nums 中 所有 子数组范围的 和 。

子数组是数组中一个连续 非空 的元素序列。

示例 1:
输入:nums = [1,2,3]
输出:4
解释:nums 的 6 个子数组如下所示:
[1],范围 = 最大 - 最小 = 1 - 1 = 0
[2],范围 = 2 - 2 = 0
[3],范围 = 3 - 3 = 0
[1,2],范围 = 2 - 1 = 1
[2,3],范围 = 3 - 2 = 1
[1,2,3],范围 = 3 - 1 = 2
所有范围的和是 0 + 0 + 0 + 1 + 1 + 2 = 4示例 2:
输入:nums = [1,3,3]
输出:4
解释:nums 的 6 个子数组如下所示:
[1],范围 = 最大 - 最小 = 1 - 1 = 0
[3],范围 = 3 - 3 = 0
[3],范围 = 3 - 3 = 0
[1,3],范围 = 3 - 1 = 2
[3,3],范围 = 3 - 3 = 0
[1,3,3],范围 = 3 - 1 = 2
所有范围的和是 0 + 0 + 0 + 2 + 0 + 2 = 4示例 3:
输入:nums = [4,-2,-3,4,1]
输出:59
解释:nums 中所有子数组范围的和是 59提示:
1 <= nums.length <= 1000
-10^9 <= nums[i] <= 10^9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-subarray-ranges
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 单调栈,获取每个数字作为最大或者最小的左右极限位置
  • 单独考虑每个数字可以作为最大值或者最小值的次数,到左右极限位置处的个数相乘种组合
class Solution:def subArrayRanges(self, nums: List[int]) -> int:def getRange(nums, neg):nums_ = copy.deepcopy(nums)if neg:for i in range(len(nums)):nums_[i] = -nums_[i] # 找最小值的左右区间,取个负数,逻辑跟正数一样L, R = list(range(len(nums))), list(range(len(nums)))q = []for i in range(len(nums)):while len(q) and nums_[q[-1]] < nums_[i]:q.pop()L[i] = q[-1]+1 if len(q) else 0q.append(i)q = []for i in reversed(range(len(nums))):while len(q) and nums_[q[-1]] <= nums_[i]:q.pop() # 注意上下只能有一个 = 号R[i] = q[-1]-1 if len(q) else (len(nums)-1)q.append(i)return L, RL1, R1 = getRange(nums, neg=False)L2, R2 = getRange(nums, neg=True)ans = 0for i in range(len(nums)):# print(L1[i], R1[i], L2[i], R2[i])ans += (R1[i]-i+1)*(i-L1[i]+1)*nums[i]-(R2[i]-i+1)*(i-L2[i]+1)*nums[i]return ans

140 ms 15.2 MB Python3


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 2104. 子数组范围和(单调栈)相关推荐

  1. LeetCode 581. 最短无序连续子数组(排序单调栈)

    文章目录 1. 题目 2. 解题 2.1 排序 2.2 4次遍历 2.3 单调栈 1. 题目 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. ...

  2. LeetCode 1856. 子数组最小乘积的最大值(前缀和 + 单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 一个数组的 最小乘积 定义为这个数组中 最小值 乘以 数组的 和 . 比方说,数组 [3,2,5] (最小值是 2)的最小乘积为 2 * (3+2+5) ...

  3. LeetCode 907. 子数组的最小值之和(单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个整数数组 A,找到 min(B) 的总和,其中 B 的范围为 A 的每个(连续)子数组. 由于答案可能很大,因此返回答案模 10^9 + 7. 示 ...

  4. LeetCode 898. 子数组按位或操作(前缀和思想)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 正解 1. 题目 我们有一个非负整数数组 A. 对于每个(连续的)子数组 B = [A[i], A[i+1], ..., A[j]] ( i ...

  5. leetcode - 898. 子数组按位或操作(使用了集合)

    我们有一个非负整数数组 A. 对于每个(连续的)子数组B=[A[i],A[i+1],...,A[j]](i<=j)B = [A[i], A[i+1], ..., A[j]] ( i <= ...

  6. LeetCode - 644 子数组最大平均数 II

    目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 644. 子数组最大平均数 II - 力扣(LeetCode) 题目描述 给定一个包含 n 个整数的数组nums,找到最大平均值的连 ...

  7. LeetCode 区间子数组个数

    给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R). 求连续.非空且其中最大元素满足大于等于L 小于等于R的子数组个数. 例如 : 输入: A = [2, 1, 4, 3] ...

  8. 【Leetcode数组--子数组--滑动窗口】209. 长度最小的子数组 904. 水果成篮 1004. 最大连续1的个数 III 76. 最小覆盖子串(有数组操作中重要的方法:滑动窗口!!!!)

    文章目录 Leetcode209 1.问题描述 2.解决方案 解法一:两个错误思路的算法 解法二:暴力 解法三:滑动窗口法(O(n)) Leetcode904 1.问题描述 2.解决方案 Leetco ...

  9. 2104. 子数组范围和

    子数组范围和 给你一个整数数组 nums .nums 中,子数组的 范围 是子数组中最大元素和最小元素的差值. 返回 nums 中 所有 子数组范围的 和 . 子数组是数组中一个连续 非空 的元素序列 ...

最新文章

  1. 如何使用标准稳压器输出几百毫伏极低直流电压?
  2. 在python3.3后urllib2已经不能再用,只能用urllib.request来代替
  3. Winform中实现ZedGraph新增自定义Y轴上下限、颜色、标题功能
  4. C++ 术语(C++ Primer)
  5. 三数之和(Java、C实现)
  6. 第4章 Python 数字图像处理(DIP) - 频率域滤波7 - 二维DFT和IDFT的一些性质 - 傅里叶频谱和相角
  7. hadoop2.4.2集群搭建及hive与mysql集成文档记录
  8. LeetCode(530)——二叉搜索树的最小绝对差(JavaScript)
  9. python成长之路--python的安装与配置 pycharm的安装与激活
  10. 各种笔记本进入BIOS的快捷键
  11. linux服务运维管理,Linux服务器运维管理(第2版)
  12. 关于临时指针变量和其他临时变量的区别
  13. Sublime text3常用的快捷键—骚骚的编辑器
  14. mac dreamveaver cc破解方法
  15. 项目里的UT越来越慢,怎么办?
  16. 用map代替双重for循环,stream流代替双重for循环
  17. Linux有名管道与无名管道简介
  18. 如何将kali系统写入U盘,并在U盘中启动。
  19. 导航上显示某个地点已关闭什么意思_导航只认手机高德和百度?已经有车载导航帅到我了...
  20. 3D实时渲染中的BSP树和多边形剔除

热门文章

  1. 名词解释 算法的有限性_数据结构与算法期中考试卷(含答案)
  2. Python中的yield详解
  3. JavaWeb笔记05-解决线程安全问题
  4. JavaScript中的循环
  5. opencv3/C++ 机器学习-SVM应用实例:药品(胶囊)识别与分类
  6. 深入理解C++中的explicit关键字
  7. oracle12c多个pdb,ProxmoxVE 之 oracle12C 多CDB和PDB
  8. appium+python自动化项目实战(二):项目工程结构
  9. 学习方向、当前要做的事
  10. linux驱动简单介绍