有个特殊情况,除数为0时,值为无穷大,所以0不能作为二分左端点。
将1作为二分左端点又缺失case
所以,ans为1时,单独处理
小记,二分返回左端点和右端点是两种思路
class Solution {
public:
long long doSum(int key,vector<int>& nums){
long long sum = 0;
for(int i=0;i<nums.size();i++){
int a = nums[i]/key;
int b = nums[i]%key;
sum += a;
if(b!=0) sum++;
}
return sum;
}
int bsearch(int left,int right,int T,vector<int>& nums){
if(left >= right -1) return right;
int mid = (left+right)/2;
long long sumM = doSum(mid,nums);
if(sumM <= T) return bsearch(left,mid,T,nums);
return bsearch(mid,right,T,nums);
}
int smallestDivisor(vector<int>& nums, int threshold) {
long long sum = doSum(1,nums);
if(sum <= threshold) return 1;
int left = 1;
int right = 1000000;
return bsearch(left,right,threshold,nums);
}
};