使用Python查找已排序子数组和的范围总和的程序

使用Python查找已排序子数组和的范围总和的程序

假设我们有一个具有n个正元素的数组nums。如果计算nums的所有非空连续的子数组和,然后以不递减的方式对它们进行排序,通过创建一个新数组n*(n+1)/2个数字。我们必须找到新数组的左索引和右索引(指定为1为起始索引)之间数字的总和。答案可能非常大,因此返回结果模除10^9+7。

因此,如果输入如下nums = [1,5,2,6],left = 1,right = 5,那么输出将是20,因为这里的所有子数组和是1、5、2、6、6、7、8、8、13、14,因此在排序后,它们是[1,2,5,6,6,7,8,8,13,14],从索引1到5的元素的总和为1+5+2+6+6 = 20。

为了解决这个问题,我们将遵循以下步骤:

  • m := 10^9 + 7

  • n := nums的大小

  • a := 一个新的列表

  • 循环0到n – 1的i,执行以下操作–

    • 循环i到n – 1的j,执行以下操作–
      • 如果i等于j,则

      • 在a的末尾插入nums[j]

      • 否则,

      • 在a的末尾插入((nums[j] + a的最后一个元素) mod m)

  • 对列表a进行排序

  • sm := a中所有元素之和(从索引left-1到right)

  • 返回sm mod m

让我们看以下实现以获得更好的理解-

更多Python相关文章,请阅读:Python 教程

实例

def solve(nums, left, right):
    m = 10**9 + 7
    n = len(nums)
    a=[]
    for i in range(n):
        for j in range(i,n):
            if i==j:
                a.append(nums[j])
            else:
                a.append((nums[j]+a[-1])%m)
    a.sort()
    sm=sum(a[left-1:right])
    return sm % m
nums = [1,5,2,6]
left = 1
right = 5
print(solve(nums, left, right))

输入

[1,5,2,6], 1, 5

输出

20

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程