這裡是題目描述:leetcode-907.子陣列的最小值之和
本題給定乙個整數陣列a
,求a
的所有(連續)子陣列的最小值的和,直觀上可以用暴力法:列出a
的所有子陣列,分別求出這些子陣列的最小值,再分別將這些最小值相加。但是通過分析時間複雜度:列舉出所有子陣列需要o(n2)的時間複雜度,求乙個子陣列的最小值需要o(n)時間複雜度,因此整體需要o(n3)的時間複雜度,會超出時間限制,提交無法通過。我們需要時間效率更優的解法
本題可以轉化為:求a
中的每個數字是a
的幾個子陣列的最小值,只要知道了它是幾個子陣列的最小值,就可以將每個數字和它們對應的子陣列個數相乘,乘積的和就是所求的最小值之和。例如:
a=[3,1,2,4]
數字3
是這些子陣列的最小值:[3]
共1個
數字1
是這些子陣列的最小值:[1]
、[3,1]
、[1,2]
、[3,1,2]
、[1,2,4]
、[3,1,2,4]
共6個
數字2
是這些子陣列的最小值:[2]
、[2,4]
共2個
數字4
是這些子陣列的最小值:[4]
共1個
所以子陣列的最小值之和 = 3x1+1x6+2x2+4x1 = 17
那麼如何求乙個數字是幾個子陣列的最小值呢?我們只需求這個數字在a
中位於它左邊比它大的數字的個數以及位於它右邊比它大的數字個數。以上面的a
為例,對於數字1
,在a
中位於它左邊且比它大的數字有1個,位於它右邊且比它大的數字有2個,再考慮到數字1
本身,因此以1
為最小值的子陣列個數為(1+1)x(2+1) = 2x3 = 6
那麼由該如何計算乙個數字在陣列a
中比它左右兩邊小的數字的個數?我們在遍歷陣列過程中使用棧這種資料結構:
//用來存入棧的棧幀類
}時間複雜度:o(n)空間複雜度:o(n)
LeetCode 907 子陣列的最小值之和
給定乙個整數陣列a,找到min b 的總和,其中b的範圍為a的每個 連續 子陣列。由於答案可能很大,因此返回答案模10 9 7。示例 輸入 3,1,2,4 輸出 17 解釋 子陣列為 3 1 2 4 3,1 1,2 2,4 3,1,2 1,2,4 3,1,2,4 最小值為 3,1,2,4,1,1,2...
907 子陣列的最小值之和
碰到leetcode907,子陣列的最小值之和,用python3按自己思路寫死都過不去,怎麼都超時,這是python3 class solution def sumsubarraymins self,a type a list int rtype int res 0 length len a for...
907 子陣列的最小值之和
題目描述 給定乙個整數陣列 arr,找到 min b 的總和,其中 b 的範圍為 arr 的每個 連續 子陣列。由於答案可能很大,因此 返回答案模 10 9 7 示例 1 輸入 arr 3,1,2,4 輸出 17 解釋 子陣列為 3 1 2 4 3,1 1,2 2,4 3,1,2 1,2,4 3,1...