棧-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;
        }
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Java byte code 的學習意義 為啥要學java bytecode,這就跟你問我已經會python了為...
    shanggl閱讀 1,690評論 0 3
  • 棧:如何實現瀏覽器的前進和后退功能? 瀏覽器的前進、后退功能,我想你肯定很熟悉吧? 當你依次訪問完一串頁面 a-b...
    GhostintheCode閱讀 915評論 0 2
  • 1. 找出數組中重復的數字 題目:在一個長度為n的數組里的所有數字都在0到n-1的范圍內。數組中某些數字是重復的,...
    BookThief閱讀 1,815評論 0 2
  • 前言 2. 實現 Singleton 3. 數組中重復的數字 4. 二維數組中的查找 5. 替換空格 6. 從尾到...
    Observer_____閱讀 2,975評論 0 1
  • 1 初級排序算法 排序算法關注的主要是重新排列數組元素,其中每個元素都有一個主鍵。排序算法是將所有元素主鍵按某種方...
    深度沉迷學習閱讀 1,431評論 0 1