持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情
每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。
题目(已做删减处理)
给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。由于答案可能很大,因此 返回答案模 10^9 + 7
分析
一道比较困难的动态规划题目。从题目中要求的子数组个数,我们就能够很容易的猜测出题目要使用动态规划的相关知识点了。我们可以进一步分析dp的过程:将数组中的每一个元素作为有边界,依次求子数组中的最小值,最后进行相加就得到了结果。
我们可以是用单调栈这个数据结构,来记录每一个元素作为最小值的范围。栈的数据结构决定了 前一个元素一定比后一个元素小。那么栈的数值也就记录了当前元素和当前元素作为最小值的左边界,当栈顶数据大于当前元素的时候,那么意味着这个元素是最小的,即子数组的有边界。
总结
一道比较困难的算法题。主要涉及到了动态规划和单调栈。我觉得它已经可以归类于hard类型的。一是因为里面要考虑的情况的确比较复杂,另一个原因就是这种两个知识点叠加,而且要在这个过程中相互使用。但是,即使这道题目比较困难,我也建议学习算法的同学们好好学习一下。这道题目能够很好的培养算法常识,而且并不是特别困难,稍微理解一下知识点,也是能够解答出来的。