給定乙個非負整數陣列和乙個整數 m,你需要將這個陣列分成 m 個非空的連續子陣列。設計乙個演算法使得這m 個子陣列各自和的最大值最小。 注意: 陣列長度 n 滿足以下條件: 1 ≤ n ≤ 1000 1 ≤ m ≤ min(50, n)
輸入: nums = [7,2,5,10,8] m = 2
輸出: 18
解釋: 一共有四種方法將nums分割為2個子陣列。
其中最好的方式是將其分為[7,2,5] 和 [10,8], 因為此時這兩個子陣列各自的和的最大值為18,在所有情況中最小。
為什麼要貪心地使子陣列和不斷逼近mid?
class solution(object):
def splitarray(self, nums, m):
# 由於題目的返回要求:返回最小和的值
# 最小和必然在 [max(nums), sum(nums)] 間
# 可以使用二分來進行查詢
low, high = max(nums), sum(nums)
while low < high:
mid = (low + high) // 2
# 淘汰演算法
# 陣列分成 m 個非空的連續子陣列
# 由前向後對nums進行劃分,使其子陣列和 <= mid,然後統計滿足條件的陣列數量
# 若我們選的sum值過小,則滿足條件的數量 > m,目標值應落在 [mid+1, high]
# 若我們選的sum值過大,則滿足條件的數量 < m,目標值應落在 [low, mid-1]
count = 0
sub_sum = 0
for i in range(len(nums)):
sub_sum += nums[i]
if sub_sum > mid:
count += 1
sub_sum = nums[i]
# 注意:末尾還有乙個子陣列我們沒有統計,這裡把它加上
count += 1
if count > m:
low = mid + 1
else:
high = mid
return low
nums = [7, 2, 5, 10, 8]
# # 分為[7,2,5] [10,8], 此時這兩個子陣列各自的和的最大值為18,在所有情況中最小。
m = 2
s = solution()
print(s.splitarray(nums, m))
LeetCode410 分割陣列的最大值
leetcode410.分割陣列的最大值 給定乙個非負整數陣列和乙個整數 m,你需要將這個陣列分成 m 個非空的連續子陣列。設計乙個演算法使得這 m 個子陣列各自和的最大值最小。注意 陣列長度 n 滿足以下條件 1 n 1000 1 m min 50,n 示例 輸入 nums 7,2,5,10,8 ...
LeetCode 410 分割陣列的最大值
給定乙個非負整數陣列和乙個整數 m,你需要將這個陣列分成 m 個非空的連續子陣列。設計乙個演算法使得這 m 個子陣列各自和的最大值最小。注意 陣列長度 n 滿足以下條件 1 n 1000 1 m min 50,n 示例 輸入 nums 7,2,5,10,8 m 2 輸出 18 解釋 一共有四種方法將...
leetcode 410 分割陣列的最大值
410.分割陣列的最大值 給定乙個非負整數陣列和乙個整數 m,你需要將這個陣列分成 m 個非空的連續子陣列。設計乙個演算法使得這 m 個子陣列各自和的最大值最小。注意 陣列長度 n 滿足以下條件 1 n 1000 1 m min 50,n 示例 輸入 nums 7,2,5,10,8 m 2 輸出 1...