题目
给定一个非负整数数组
nums
和一个整数k
,你需要将这个数组分成k
个非空的连续子数组。设计一个算法使得这
k
个子数组各自和的最大值最小。
解题
"""
时间复杂度是 O(N log S),其中 N 是数组的长度,S 是数组元素的总和。
"""
def can_split(nums, max_sum, k):
current_sum = 0
splits = 1 # 至少有一个子数组
for num in nums:
if current_sum + num > max_sum:
splits += 1
current_sum = num
else:
current_sum += num
if splits > k:
return False
return True
def splitArray(nums, k):
left, right = max(nums), sum(nums)
while left < right:
mid = (left + right) // 2
if can_split(nums, mid, k):
right = mid
else:
left = mid + 1
return left
# 示例输入
nums = [7, 2, 5, 10, 8]
k = 2
# 输出
print(splitArray(nums, k)) # 输出: 18