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

题目描述:
给你一个整数数组 nums 和一个正整数 threshold ,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。
请你找出能够使上述结果小于等于阈值 threshold 的除数中 最小 的那个。
每个数除以除数后都向上取整,比方说 7/3 = 3 , 10/2 = 5 。
题目保证一定有解。

示例 1:
输入:nums = [1,2,5,9], threshold = 6
输出:5
解释:如果除数为 1 ,我们可以得到和为 17 (1+2+5+9)。
如果除数为 4 ,我们可以得到和为 7 (1+1+2+3) 。如果除数为 5 ,和为 5 (1+1+1+2)。

示例 2:
输入:nums = [2,3,5,7,11], threshold = 11
输出:3

示例 3:
输入:nums = [19], threshold = 5
输出:4

提示:
1 <= nums.length <= 5 * 10^4
1 <= nums[i] <= 10^6
nums.length <= threshold <= 10^6

方法1:
主要思路:解题汇总链接
(1)二分;
(2)确定二分的范围1到nums中的最大值的加一;
(3)确定中值是否满足给定的阈值条件,若满足,则变换右边界,同时保存当前中值,若不满足,则变换左边界;

class Solution {
public:
    bool check(vector<int>&nums,int threshold,int div){//判读当前值div是否能够满足阈值条件
        int res=0;
        for(int&n:nums){
            res+=n/div;
            if(n%div){
                ++res;
            }
            if(res>threshold){//不满足直接返回false
                return false;
            }
        }
        return true;//说明满足
    }
    int smallestDivisor(vector<int>& nums, int threshold) {
        int left=1;//确定左边界
        int right=(*max_element(nums.begin(),nums.end()))+1;//确定右边界
        int res=0;
        while(left<=right){
            int mid=left+(right-left)/2;//中值
            if(check(nums,threshold,mid)){
                right=mid-1;   //调整右边界
                res=mid;//同时保存当前满足条件的中值
            }
            else{
                left=mid+1;
            }
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值