使用 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
廣告