使用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)
- 循环i到n – 1的j,执行以下操作–
-
对列表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