二分查找:
个人总结的二分查找有两种:
1、二分对象为索引。例如,有序表查找某个元素的存在性
2、二分对象为值(所求值)。例如,本题。先确定ret的范围[low,high],然后,不断验证ret,从而缩小范围
class Solution {
public:
int splitArray(vector<int>& nums, int m) {
long high = 0,
low = *max_element(nums.begin(), nums.end());
for (int num : nums)
{ high += num; }
long ret = 0x7FFFFFFF;
while (high >= low) {
long mid = (high + low) >> 1,
sum = 0,
max_sum = 0,
cnt = m;
bool success_split = true;
for (int i = 0; i < nums.size();) {
sum += nums[i];
if (sum <= mid) {
max_sum = max(max_sum, sum);
i++;
}
else {
if (--cnt <= 0) {
success_split = false;
break;
}
sum = 0;
}
}
if (success_split) {
ret = min(ret, max_sum);
high = mid - 1;
}
else {
low = mid + 1;
}
}
return ret;
}
};