搭建网站全过程,建筑网站免费,鲜花品牌网站建设,wordpress 亲子模板下载文章目录1. 题目2. 解题1. 题目
给你一个整数数组 nums 。nums 中#xff0c;子数组的 范围 是子数组中最大元素和最小元素的差值。
返回 nums 中 所有 子数组范围的 和 。
子数组是数组中一个连续 非空 的元素序列。
示例 1#xff1a;
输入#xff1a;nums [1,2,3]
输…
文章目录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, negFalse)L2, R2 getRange(nums, negTrue)ans 0for i in range(len(nums)):# print(L1[i], R1[i], L2[i], R2[i])ans (R1[i]-i1)*(i-L1[i]1)*nums[i]-(R2[i]-i1)*(i-L2[i]1)*nums[i]return ans140 ms 15.2 MB Python3 我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号Michael阿明一起加油、一起学习进步