Python程式:查詢列表中每個子列表的最小值的總和
假設我們有一個名為nums的數字列表。我們需要找到nums中每個子列表x的最小值x的總和。如果答案過大,則將結果模 10^9 + 7。
所以,如果輸入類似於nums = [5, 10, 20, 10, 0],則輸出將為90,因為子列表為[[5], [10], [20], [10], [0], [5,10], [10,20], [20,10], [10,0], [5,10,20], [10,20,10], [20,10,0], [5,10,20,10], [10,20,10,0], [5,10,20,10,0]],它們的最小值為[5, 10, 20, 10, 0, 5, 10, 10, 0, 5, 10, 0, 5, 0, 0],所以總和為90。
為了解決這個問題,我們將遵循以下步驟:
- ans := 0
- s := 新列表
- temp_sum := 0
- 對於nums中的每個索引和值,執行以下操作:
- 當s不為空且值小於等於s中最後一個列表的索引1處的元素時,執行以下操作:
- temp_sum := temp_sum - s中最後一個列表的索引2處的元素
- 從s中刪除最後一個元素
- 如果s為空,則
- 在s中插入一個包含三個元素的列表[索引,值,(索引 + 1)*值]
- 否則,
- 插入一個包含三個元素的列表[索引,值,(索引 - s中最後一個列表的第一個元素)*值]
- temp_sum := temp_sum + s中最後一個列表的索引2處的元素
- ans := ans + temp_sum
- 當s不為空且值小於等於s中最後一個列表的索引1處的元素時,執行以下操作:
- 返回ans模 (10^9 + 7)
示例
讓我們檢視以下實現以獲得更好的理解:
def solve(nums): ans = 0 s = [] temp_sum = 0 for index, value in enumerate(nums): while s and value <= s[-1][1]: temp_sum -= s[-1][2] s.pop() if not s: s.append([index, value, (index + 1) * value]) else: s.append([index, value, (index - s[-1][0]) * value]) temp_sum += s[-1][2] ans += temp_sum return ans % (10**9 + 7) nums = [5, 10, 20, 10, 0] print(solve(nums))
輸入
[5, 10, 20, 10, 0]
輸出
90
廣告