leetcode1283 使结果不超过阈值的最小除数

使用二分法:所以复杂度为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;
    }
};

猜你喜欢

转载自www.cnblogs.com/joelwang/p/12009443.html