【Leetcode】1283-使结果不超过阈值的最小除数(Find the Smallest Divisor Given a Threshold)

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

在这里插入图片描述
在这里插入图片描述

解法.

  1. 蛮力法很直观也很好理解,但会超时。
  2. 二分法,首先确定下来最终结果会出现的范围,我想到的上下界为【1,max(nums)】,从中间位置【mid=(low+high)//2】处开始进行判定。while循环的循环表达式为【low!=high】,当【low=high】时循环结束,这时high的值就是结果。接下来是具体的二分条件,当mid能够满足threshold的条件,即sum<=threshold时,移动上界到mid处,对应语句【high=mid】,注意此时的mid是被保留的,因为它确实能够满足条件,我们无法排除它就是最终结果的可能,所以这一次的mid需要留在区间中;当mid无法满足threshold的条件,即sum>threshold时,移动下界到mid+1处,对应语句【low=mid+1】,我们注意这一次的mid是被排除的,因为显然我们可以确定,这个mid不会是结果,所以无需不必要的扩大解区间,这也保证了循环表达式能够成功终止while循环。
import math
class Solution:
    def smallestDivisor(self, nums: List[int], threshold: int) -> int:
        low=1
        high=max(nums)
        while low!=high:
            mid=(low+high)//2
            newList=[-(-num//mid) for num in nums]
            if sum(newList)<=threshold:
                high=mid
            else:
                low=mid+1
        return high

在这里插入图片描述

官方解答.

思想依旧是二分法,具体细节也类似,整理如下:
假设我们选择了除数d,当d增加时,正整数数组nums中的每个数num[i]除以d的结果num[i]/d单调递减,它们的和total同样也单调递减。
根据上述的单调性,我们就可以使用二分查找的方法,找出满足 total <= threshold 的最小除数 d。具体地,假设我们当前在二分查找的区间 [l, r] 中选择了除数 d’,并计算出了对应的 total’,此时会出现两种情况:
如果 total’ > threshold,那就说明我们选择的 d’ 不满足要求。根据单调性,减小 d’ 的值会增大 total’ 的值,那么区间 [l, d’] 中不可能存在满足要求的除数,因此我们可以在区间 (d’, r] 中继续进行二分查找。
如果 total’ <= threshold,那就说明我们选择的 d’ 满足要求。由于题目中要求除数尽可能小,因此我们可以忽略区间 (d’, r],而在区间 [l, d’) 中继续进行二分查找。
这样我们就可以方便地使用二分查找得出最优解。
那么如何确定二分查找的上下限呢?显然,二分查找的下限是 1,这是最小的正整数。而二分查找的上限可以设置为数组 nums 中的最大值 M,这是因为当除数 d >= M 时,数组 nums 中的每个数除以 d 的结果均为 1,total 的值恒等于数组 nums 的长度。由于题目中要求除数尽可能小,那么选择除数 d = M 一定比 d > M 更优。因此,将二分查找的上限设置为 M,可以保证不遗漏最优解。

class Solution:
    def smallestDivisor(self, nums: List[int], threshold: int) -> int:
        l, r, ans = 1, max(nums) + 1, -1
        while l <= r:
            mid = (l + r) // 2
            total = sum((x - 1) // mid + 1 for x in nums)
            if total <= threshold:
                ans = mid
                r = mid - 1
            else:
                l = mid + 1
        return ans

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/find-the-smallest-divisor-given-a-threshold/solution/shi-jie-guo-bu-chao-guo-yu-zhi-de-zui-xiao-chu-s-3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44246009/article/details/107348607
今日推荐