# 410. Split Array Largest Sum
#### Difficulty: Hard
link: https://leetcode.com/problems/split-array-largest-sum/
### 1. Binary Search
#### $O(n\ log\ m)$ runtime, $O(1)$ space
###### n = len(nums), m = sum(nums)
先分析題目,如果要討論所有可能的subarray切法,這是重複組合的問題:把n個物品分成k堆,每一堆至少要有1個物品。
每一堆優先分配ㄧ個物品後,就變成非負整數解問題$X_1+...+X_k=n-k$,總共有$H^k_{n-k}=C^{n-1}_{k-1}$種可能,窮舉所有可能的解法沒辦法在多項式時間內解完,所以要另外想辦法。
改成直接猜一個largest_sum,檢查能否切出k個subarray,每個subarray總和不超過largest_sum,再利用binary search找出滿足這個條件的最小值。
搜尋範圍的下界是max(nums),也就是k=n的情況;上界是sum(nums),也就是k=1的情況。
feasible函數的for迴圈從左邊開始,蒐集總和不超過largest_sum的元素為一堆,檢查堆數小於等於k,即為合法。
##### python
```python=
class Solution:
def splitArray(self, nums: List[int], k: int) -> int:
def feasible(largest_sum):
total = 0
count = 0
for num in nums:
total += num
if total > largest_sum:
count += 1
total = num
return count + 1 <= k
left, right = max(nums), sum(nums)
while left < right:
mid = left + (right - left) // 2
if feasible(mid):
right = mid
else:
left = mid + 1
return left
```
###### tags: `leetcode`