题目描述:
方法:二分法 O(N*log(summ - maxn))
class Solution: def splitArray(self, nums: List[int], m: int) -> int: n = len(nums) s = 0 for num in nums: s += num l, r, ans = 0, s, s while l <= r: mid = (l + r) // 2 flag, cnt, now = True, 1, 0 for i in range(n): if nums[i] > mid: flag = False break if now + nums[i] > mid: cnt += 1 now = 0 now += nums[i] if flag and cnt <= m: ans, r = mid, mid - 1 else: l = mid + 1 return ans
方法二:动态规划 来自官方题解: O(N2M) O(NM)
class Solution: def splitArray(self, nums: List[int], m: int) -> int: n = len(nums) f = [[10**18] * (m + 1) for _ in range(n + 1)] sub = [0] for elem in nums: sub.append(sub[-1] + elem) f[0][0] = 0 for i in range(1, n + 1): for j in range(1, min(i, m) + 1): for k in range(i): f[i][j] = min(f[i][j], max(f[k][j - 1], sub[i] - sub[k])) return f[n][m] 作者:LeetCode-Solution 链接:https://leetcode-cn.com/problems/split-array-largest-sum/solution/fen-ge-shu-zu-de-zui-da-zhi-by-leetcode-solution/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原文:https://www.cnblogs.com/oldby/p/13379193.html