使用 Python 查找排序子数组和的范围和的程序
假设我们有一个包含 n 个正元素的数组 nums。如果我们计算 nums 的所有非空连续子数组的和,然后以非递减的方式对它们进行排序,通过创建一个包含 n*(n+1)/2 个数字的新数组。我们需要找到新数组中从索引 left 到索引 right(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
让我们看看以下实现,以便更好地理解 -
示例
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
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP