在Python中找到列表中每个子列表的最小值之和的程序

在Python中找到列表中每个子列表的最小值之和的程序

假设我们有一个名为nums的数字列表。我们必须找到nums中每个子列表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和value <= s中的最后一个列表的index 1元素时,执行
      • temp_sum:= temp_sum- s中的最后一个列表的index 2元素
      • 从s中删除最后一个元素
    • 如果s为空,则
      • 在s中插入一个具有三个元素[index,value,(index + 1)* value]的列表
    • 否则,
      • 插入一个具有三个元素[index,value,(index- s中最后一个列表的第一个元素)* value]的列表
    • temp_sum:= temp_sum + s中的最后一个列表的index 2元素
    • ans:= ans + temp_sum
  • 返回ans mod(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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程