使用 Python 查找已排序子数组和的范围和的程序
假设我们有一个包含n个正元素的数组nums。如果我们计算nums的所有非空连续子数组的总和,然后通过创建一个新的n*(n+1)/2个数字数组以非递减的方式对它们进行排序。我们必须在新数组中找到从索引左到索引右(1索引)的数字总和。答案可能非常大,因此返回结果模10^9+7。
所以,如果输入像nums=[1,5,2,6]left=1right=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。
为了解决这个问题,我们将按照以下步骤操作-
米:=10^9+7
n:=数字的大小
a:=一个新列表
对于0到n-1范围内的i,请执行
如果i与j相同,则
否则,
在a的末尾插入nums[j]
在a的末尾插入((nums[j]+a)modm的最后一个元素
对于i到n-1范围内的j,执行
对列表排序a
sm:=a的所有元素的总和[从索引left-1到右])
返回smmodm
让我们看看以下实现以获得更好的理解-
示例
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