美文网首页
栈-N907-子数组的最小值之和

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

作者: 三次元蚂蚁 | 来源:发表于2019-04-27 11:54 被阅读0次

题目

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

  • 输入:整数数组,长度范围[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;
        }
    }
}

相关文章

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

    题目 概述:给定一个数组,求该数组的所有连续子数组最小元素的和 输入:整数数组,长度范围[1, 30000] 输入...

  • 5.栈(五)

    题目汇总:https://leetcode-cn.com/tag/stack/907. 子数组的最小值之和中等(题...

  • 编程记录

    code programming 计算数组子数组之和的最大值 描述:给定一个包含N个整数的数组,求数组子数组之和的...

  • 907. 子数组的最小值之和

    题目: 给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。 ...

  • #常见面试算法题

    阅读目录 *求数组最大连续子序列之和 1.求数组最大连续子序列之和 一个有N个元素的整型数组arr,有正有负,数组...

  • 子数组之和

    1.题目描述 给定一个含有n个元素的整形数组a,再给定一个和sum,求出数组中满足给定和的所有元素组合,举个例子,...

  • 栈系列之-获取最小值

    一、栈获取最小值算法概述 获取栈的最小值算法:可以动态的获取一个栈中元素的最小值,动态的意思是,当该栈发生push...

  • 最大子数组之和

    问题: 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组。 描述: 输入的数组为1...

  • 数组利用前缀和求子数组问题

    1、子数组之和https://www.lintcode.com/problem/subarray-sum/desc...

  • 二.栈 4 带有取最小值min方法的栈

    问题:实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。你实现的栈将支持push,pop 和 ...

网友评论

      本文标题:栈-N907-子数组的最小值之和

      本文链接:https://www.haomeiwen.com/subject/gtohnqtx.html