leetcode 907

leetcode 907

波波老师你好, 907题我找到一个这样的代码, 我看跟您的题库也比较相近, 不过我没有太明白的是 

res = (res + (long)A[j] * (i - j) * (j - k)) % mod;

这句代码,  

(long)A[j] * (i - j) * (j - k)

这个计算背后的逻辑是什么, 为什么他就把每个array最小的加在一起了


相关代码:

  public int sumSubarrayMins(int[] A) {
        Stack<Integer> s = new Stack<>();        int n = A.length, j, k;        long res = 0, mod = (long)1e9 + 7;        for (int i = 0; i <= n; i++) {            while (!s.isEmpty() && A[s.peek()] > (i == n ? 0 : A[i])) {
                j = s.pop();
                k = s.isEmpty() ? -1 : s.peek();
                res = (res + (long)A[j] * (i - j) * (j - k)) % mod;

            }
            s.push(i);
        }        return (int)res;
    }

非常感谢您的解答!

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
liuyubobobo 2022-02-02 08:45:00

在运行 

res = (res + (long)A[j] * (i - j) * (j - k)) % mod;


这句话的时候,A[j] 是区间 [k, i] 的最小值(j 在 [k, i] 之间。)。[k, i] 之间有多少个区间包含 A[j],A[j] 就会在最终的结果中出现多少次。


[k, i] 之间包含 j 的区间个数是,对 j 这个位置向左边拓展,最多拓展到 k;向右边拓展,最多拓展到 i。左边拓展有 (j - k) 种可能,右边拓展有 (i - j) 种可能,所以一共有 (i - j) * (j - k) 个区间的最小值是 A[j]。


==========


这个问题的核心其实是:


为什么在运行 

res = (res + (long)A[j] * (i - j) * (j - k)) % mod;

的时候,A[j] 是区间 [k, i] 的最小值?

(如果你理解这个原因,下面可以不看了。)


这里用到的是单调栈。单调栈是栈的一个应用,讲清楚单调栈还是挺麻烦的,不是一两句话能讲清楚的,一般在面试中(尤其是国内的面试中)基本也不会考。我强烈建议根据这个问题看这个题解,来理解单调栈。这篇文章是我见过的讲单调栈最清楚的文章(这个题解的作者也是我的课程学生:))

https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/bao-li-jie-fa-zhan-by-liweiwei1419/


只不过这个问题是动态求解区间的最大值,你问的 907 号问题是求最小值而已,他们背后偶的思想是一样的。



P.S. 84 号问题是 hard,907 号问题是 medium,是不合理的。在我看来,907 可能要比 84 还难一些,至少是一个难度级别。所以力扣的难度分级是不合理的。看看就好。


继续加油!:)

  • 提问者 weixin_慕圣6334738 #1

    老师我想请问下既然 (i - j) * (j - k) 表示区间有多少个组合最小值是 A[j], 为什么它这个答案里面还要乘

    (long)A[j]

    , 这里转化成long 类型是什么意思

    2022-02-20 11:12:10
  • liuyubobobo 回复 提问者 weixin_慕圣6334738 #2

    题目求的是值的和, (i - j) * (j - k) 是个数,有这么多个区间的最小值是 A[j],所以再乘以 A[j]。转换成 long 的意思就是转换成 long,问题的结果用 int 会溢出。

    2022-02-20 13:11:41
  • 提问者 weixin_慕圣6334738 回复 liuyubobobo #3

    老师我看一下你发的文章我感觉还是没太明白(:(可能我太菜了), 您能顺便解释下上面我发的那个代码中的while loop背后的逻辑是什么吗, 非常感谢您

    2022-02-22 07:15:33
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师