解題概念和 Capacity To Ship Packages Within D Days 一樣,連 code 都ㄧ樣。
心得: 在解題時,用類似 NP Completeness Definition 中提到的 NP 的概念,先將一些變數固定下來,這組變數會使得問題可以得到一個解,以此題來說就是將 splitted array’s sum 固定下來,然後問自己,給定這個 sum,我是否可以驗證 nums 被分割成 k 個 subarray 後,每個 subarray 的合都不會超過 sum?若可以,再來想辦法 minimize 這個 sum,而 minimize 的方法就是 binary search。
Code
class Solution {
public:
int splitArray(vector<int>& nums, int k) {
int l, r = 0;
for(int n: nums) {
l = max(l, n);
r += n;
}
while(l < r) {
int mid = l + (r - l) / 2;
if( canSplit(mid, nums, k) ) {
r = mid;
} else {
l = mid + 1;
}
}
return l;
}
bool canSplit(int arraySum, vector<int>& nums, int k) {
int sum = 0;
int splitCount = 1;
for(int n: nums) {
sum += n;
if(sum > arraySum) {
sum = n;
splitCount += 1;
if (splitCount > k) return false;
}
}
return true;
}
};