使用二分法:所以复杂度为O(n*logk), k介于 left=sum/threshold(向下取整) 和 right=num_max之间;
而right<=10^6, left>=1; 故logk <=6log2(10) ~=18;
class Solution { public: int smallestDivisor(vector<int>& nums, int threshold) { long int sum=0; int right=INT_MIN; int res=INT_MAX; for(int num:nums){ sum+=num; if(num>right) right=num; } int left=sum/threshold; if(left==0) left=1; while(left<right){ int mid=left+(right-left)/2; int tmp=0; for(int num:nums){ tmp+=num/mid+( ( num % mid == 0 ) ? 0 : 1 ); } if(tmp<=threshold) { if(mid<res) res=mid; right=mid; }else{ left=mid+1; } } return res; } };