貪心 LeetCode410 分割陣列的最大值

2021-10-08 12:33:07 字數 1310 閱讀 8276

給定乙個非負整數陣列和乙個整數 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...