Python程式:查詢子陣列模m後的最大和
Python程式:查詢子陣列模m後的最大和
假設我們有一個包含n個元素的陣列nums。我們還有另一個整數m。我們必須找到其任何子陣列的和模m的最大值。
因此,如果輸入類似於nums = [1,5,7,3] m = 5,則輸出將為3,因為
- [1] mod 5 = 1
- [5] mod 5 = 0
- [7] mod 5 = 2
- [3] mod 5 = 3
- [1,5] mod 5 = 1
- [5,7] mod 5 = 2
- [7,3] mod 5 = 0
- [1,5,7] mod 5 = 3
- [5,7,3] mod 5 = 0
- [1,5,7,3] mod 5 = 1
為了解決這個問題,我們將遵循以下步驟:
- csum := 一個列表,最初將nums[0] mod m插入其中
- 對於nums中除第一個值外的每個x,執行以下操作:
- 在csum的末尾插入(csum的最後一個元素 + x) mod m
- seen := 一個列表,最初包含一個元素,即0
- max_sum := -1
- 對於csum中的每個s,執行以下操作:
- idx := 將s插入seen的最左側位置,以便列表將被排序
- 如果idx < seen的大小,則
- max_sum := max_sum和s中的最大值
- 否則,
- 將s插入seen的最左側索引,以便陣列排序
- 將s插入seen的最左側索引,以便陣列排序
- 返回max_sum
示例
讓我們看看以下實現以更好地理解:
import bisect def solve(nums, m): csum = [nums[0] % m] for x in nums[1:]: csum.append((csum[-1] + x) % m) seen = [0] max_sum = -1 for s in csum: idx = bisect.bisect_left(seen, s) if idx < len(seen): max_sum = max(max_sum, s, (s - seen[idx]) % m) else: max_sum = max(max_sum, s) bisect.insort_left(seen, s) return max_sum nums = [1,5,7,3] m = 5 print(solve(nums, m))
輸入
"pptpp", [(1,1),(1,4),(1,1),(0,2)]
輸出
3
廣告