当前位置: 首页 > news >正文

2012. 数组美丽值求和【动态规划】

对于所有 0≤j<i 且 i<k≤n−1,满足 nums[j]<nums[i]<nums[k]

题目的这个要求,相当于:

nums[i] 要大于 i 左边的所有数,也就是大于前缀 [0,i−1] 中的最大值。
nums[i] 要小于 i 右边的所有数,也就是小于后缀 [i+1,n−1] 中的最小值

这可以通过遍历算出来。

定义 sufMin[i] 表示后缀 [i,n−1] 中的最小值。

那么 sufMin[i] 等于 nums[i] 与后缀 [i+1,n−1] 中的最小值,二者取最小值,即

sufMin[i]=min(nums[i],sufMin[i+1])
注意上式需要从右到左遍历 nums 计算。

对于前缀最大值,也同理。

我们可以在从左到右遍历 nums 的过程中,维护前缀最大值 preMax。注意这只需要一个变量,因为我们可以一边计算 preMax,一边计算答案。

class Solution:
    def sumOfBeauties(self, nums: List[int]) -> int:
        n = len(nums)
        suf_min = [0] * n  # 后缀最小值,题目中num>0
        suf_min[n - 1] = nums[n - 1]
        # sufMin[i]代表的是从索引i开始到数组末尾的最小值。
        # 而计算这个值的方法是,当前元素nums[i]和下一个位置的sufMin[i+1]中的较小者。
        # 这意味着,如果我们从数组的最后一个元素开始向前遍历,就可以逐步构建出每个位置的sufMin值。
        # 例如,考虑一个简单的数组,比如[3,1,4,2]。按照用户的方法,从右向左计算:
            # 对于i=3(最后一个元素),sufMin[3] = nums[3] = 2。
            # i=2时,sufMin[2] = min(4, sufMin[3]) = min(4,2) = 2。
            # i=1时,sufMin[1] = min(1, sufMin[2]) = min(1,2) = 1。
            # i=0时,sufMin[0] = min(3, sufMin[1]) = min(3,1) = 1。
        for i in range(n - 2, 1, -1):
            suf_min[i] = min(suf_min[i + 1], nums[i])

        ans = 0
        # 前缀最大值
        pre_max = nums[0]  
        for i in range(1, n - 1):
            x = nums[i]
            # 此时 pre_max 表示 [0, i-1] 中的最大值
            if pre_max < x < suf_min[i + 1]:
                ans += 2
            elif nums[i - 1] < x < nums[i + 1]:
                ans += 1
            # 更新后 pre_max 表示 [0, i] 中的最大值
            pre_max = max(pre_max, x)
        return ans

作者:灵茶山艾府
链接:https://leetcode.cn/problems/sum-of-beauty-in-the-array/solutions/1006001/qian-zhui-zui-da-zhi-hou-zhui-zui-xiao-z-h9qz/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
        

相关文章:

  • 学习threejs,使用LatheGeometry旋转体(榫卯体)几何体
  • texstudio: 编辑器显示行号+给PDF增加行号
  • 大数据实时分析:ClickHouse、Doris、TiDB 对比分析
  • 力扣-数组-34 在排序数组中查找元素的第一个和最后一个位置
  • 代码随想录|二叉树|07二叉树周末总结
  • 使用 Miniforge3 管理 Python 环境的详细指南(基于最新实践和时效性信息,截至 2025 年)
  • ArcGIS Pro 行政区划数据处理:拆分与提取方法详解
  • 修改桌面图标——操作系统程序图标(Windows 10)
  • 2024年广州市智能网联汽车创新实践年度报告
  • 583. 两个字符串的删除操作
  • 【数据库系统概论】第十一章 并发控制
  • dockor
  • 速通C语言——(分支和循环)
  • conda 安装软件报错 Found conflicts! Looking for incompatible packages.
  • 快速使用PPASR V3版不能语音识别框架
  • Docker Compose国内镜像一键部署dify
  • 【前端面试题】Vu3常见的面试题
  • 【网络】poll 与epoll(原理、工作模式LT、ET)
  • Windows 图形显示驱动开发-WDDM 3.2-可调性改进
  • [论文阅读]Trustworthiness in Retrieval-Augmented Generation Systems: A Survey
  • 前瞻|美联储明晨“按兵不动”几无悬念:关税战阴霾下,会否释放降息信号
  • 动物只有在被认为对人类有用时,它们的建筑才会被特别设计
  • 陈雯出任外交部离退休干部局局长,此前为外交部办公厅副主任
  • 印观察|印巴战火与莫迪政府三重冒险:南亚火药桶已至临界点
  • 金正恩视察重要军工企业要求推进武力强化变革
  • 央行:上市公司回购增持股票自有资金比例要求从30%下调至10%