栈-N907-子数组的最小值之和

题目

  • 概述:给定一个数组,求该数组的所有连续子数组最小元素的和

  • 输入:整数数组,长度范围[1, 30000]

  • 输入子项:整数,范围[1, 30000]

  • 输出:所有连续子数组最小元素的和对10^9+7取模

  • 出处:https://leetcode-cn.com/problems/sum-of-subarray-minimums/

思路

  • 由于需要记录之前子数组的最小值方便快速计算之后子数组的最小值,所以考虑用栈来实现

  • 将数组元素依次入栈:

    1. 如果当前数组元素大于等于栈顶元素,则以当前元素为结尾的所有子数组之和等于以栈顶元素为结尾的所有子数组之和+当前元素
    2. 如果当前数组元素小于栈顶元素,则将栈中元素依次出栈,每出栈一次加上一次当前元素*相应倍数,记录出栈元素个数为相应倍数,直到当前数组元素大于等于栈顶元素,仍然沿用1方法计算
> 特别注意:相应倍数需要累加

代码

class Solution {
    public int sumSubarrayMins(int[] A) {
        LinkedList<Node> stack = new LinkedList<>();
        int result = 0;
        int mod = 1000000007;
        int sum;
        int coef;
        Node top;
        
        result += A[0];
        stack.push(new Node(A[0], 1, A[0]));
        for (int i = 1; i < A.length; ++i) {
            sum = A[i];
            coef = 1;
            while (true) {
                if (stack.isEmpty()) {
                    stack.push(new Node(A[i], coef, sum));
                    break;
                }
                
                top = stack.peek();
                if (A[i] >= top.num) {
                    sum = (top.sum + sum) % mod;
                    stack.push(new Node(A[i], coef, sum));
                    break;
                } else {
                    sum = (A[i] * top.coef + sum) % mod;
                    coef += top.coef;
                    stack.pop();
                }
            }
            
            result = (result + sum) % mod;
        }
        
        return result;
    }
    
    private class Node {
        int num;
        int coef;
        int sum;
        public Node(int num, int coef, int sum) {
            this.num = num;
            this.coef = coef;
            this.sum = sum;
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Java byte code 的学习意义 为啥要学java bytecode,这就跟你问我已经会python了为...
    shanggl阅读 5,709评论 0 3
  • 栈:如何实现浏览器的前进和后退功能? 浏览器的前进、后退功能,我想你肯定很熟悉吧? 当你依次访问完一串页面 a-b...
    GhostintheCode阅读 4,421评论 0 2
  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 5,891评论 0 2
  • 前言 2. 实现 Singleton 3. 数组中重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到...
    Observer_____阅读 8,183评论 0 1
  • 1 初级排序算法 排序算法关注的主要是重新排列数组元素,其中每个元素都有一个主键。排序算法是将所有元素主键按某种方...
    深度沉迷学习阅读 5,401评论 0 1

友情链接更多精彩内容