IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> LeetCode 2104. Sum of Subarray Ranges - 亚马逊高频题3 -> 正文阅读

[游戏开发]LeetCode 2104. Sum of Subarray Ranges - 亚马逊高频题3

You are given an integer array?nums. The?range?of a subarray of?nums?is the difference between the largest and smallest element in the subarray.

Return?the?sum of all?subarray ranges of?nums.

A subarray is a contiguous?non-empty?sequence of elements within an array.

Example 1:

Input: nums = [1,2,3]
Output: 4
Explanation: The 6 subarrays of nums are the following:
[1], range = largest - smallest = 1 - 1 = 0 
[2], range = 2 - 2 = 0
[3], range = 3 - 3 = 0
[1,2], range = 2 - 1 = 1
[2,3], range = 3 - 2 = 1
[1,2,3], range = 3 - 1 = 2
So the sum of all ranges is 0 + 0 + 0 + 1 + 1 + 2 = 4.

Example 2:

Input: nums = [1,3,3]
Output: 4
Explanation: The 6 subarrays of nums are the following:
[1], range = largest - smallest = 1 - 1 = 0
[3], range = 3 - 3 = 0
[3], range = 3 - 3 = 0
[1,3], range = 3 - 1 = 2
[3,3], range = 3 - 3 = 0
[1,3,3], range = 3 - 1 = 2
So the sum of all ranges is 0 + 0 + 0 + 2 + 0 + 2 = 4.

Example 3:

Input: nums = [4,-2,-3,4,1]
Output: 59
Explanation: The sum of all subarray ranges of nums is 59.

Constraints:

  • 1 <= nums.length <= 1000
  • -109?<= nums[i] <= 109

Follow-up:?Could you find a solution with?O(n)?time complexity?

题目对一个数组的子数组的范围range做了定义,即子数组中最大值与最小值的差。数组的子数组是数组中一个非空且连续的序列。要求返回一个给定数组nums的所有子数组的范围range的和。

显然可以用暴力解法,即找出所有子数组,再找出每个子数组的最大值和最小值。但是暴力解法肯定不是出题人所要的解法。

暴力解法是要算出每个子数组的最大值和最小值的差然后再求和,换种思路,要是能算出所有子数组的最大值总和与最小值总和然后再求差,那么其结果是一样的。于是题目就可以变成先找出所有子数组的最大值的和,再找出所有子数组的最小值的和。印象中LeetCode中有类似的题。

那么该如何快速计算所有子数组的最大值和或最小值和呢?先以求所有子数组的最大值和为例,由于每个子数组必然是以数组中某一个数为最大值,反过来想,如果能找出数组中以每一个数为最大值的所有子数组,也就可以算出所有子数组的最大值和。例如以第i个数为最大值的子数组的个数为k,那么这部分子数组的最大值和为nums[i] * k。

于是题目进一步演变成如何算出k,以nums[i]为中心向左找到第一个比nums[i]大的数的位置记为l,向右找到第一个比nums[i]大的数的位置记为r,那么以nums[i]为最大值的子数组个数就为k=nums[i] * (i - k) * (r - i)。具体算法可以单调递减栈来实现(与LeetCode 42. Trapping Rain Water有点 类似)。只要碰到比栈顶更小的数就放进堆栈,当遇到比栈顶大的数,就要计算以栈顶数为最大值的所有子数组个数,算完弹出栈顶数,继续比较计算当前数与栈顶数,直到当前数不大于栈顶数就停止然后把当前数入栈。要注意栈为空的情况,以及数组遍历完栈里可能还有数要继续处理。

注:最小值和求法是一样的,只要把单调递减栈换成单调递减栈即可。

class Solution:
    def subArrayRanges(self, nums: List[int]) -> int:
        n = len(nums)
        st = []
        
        minSum = 0
        for i in range(n):
            while st and nums[i] < nums[st[-1]]:
                mid = st.pop()
                j = st[-1] if st else -1
                minSum += nums[mid] * (mid - j) * (i - mid)
            st.append(i)
        while st:
            mid = st.pop()
            j = st[-1] if st else -1
            minSum += nums[mid] * (mid - j) * (n - mid)
        maxSum = 0
        for i in range(n):
            while st and nums[i] > nums[st[-1]]:
                mid = st.pop()
                j = st[-1] if st else -1
                maxSum += nums[mid] * (mid - j) * (i - mid)
            st.append(i)        
        while st:
            mid = st.pop()
            j = st[-1] if st else -1
            maxSum += nums[mid] * (mid - j) * (n - mid )
        
        return maxSum - minSum

?

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:58:26  更:2022-03-15 23:00:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 16:10:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码