最大化最小值 或 最小化最大值 ,都可以采用二分答案的方法,答案在一个确定的范围内,二分的取,每次check判定边界移动情况;
本题就二分的找最终最大的数目;
根据每次确定的mid数目,求出该数目下需要进行移动的次数,如果次数小于等于限制,说明mid取高了,还可以继续细分,否则取低了;
class Solution {
private:
vector<int> arr;
int limit;
public:
bool check(int mid) {
int times = 0;
for(auto a : arr) {
int tmp = a / mid;
if(a % mid == 0) tmp--;
times += tmp;
}
return times <= limit;
}
int minimumSize(vector<int>& nums, int maxOperations) {
arr = nums, limit = maxOperations;
int r = *max_element(nums.begin(), nums.end());
int l = 1;
while(l <= r) {
int mid = (r + l) >> 1;
if(check(mid)) r = mid - 1;
else l = mid + 1;
}
return l;
}
};