1 class Solution:
 2     def smallestDivisor(self, nums: 'List[int]', threshold: int) -> int:
 3         n = len(nums)
 4         nums = sorted(nums)
 5         l,h = 1,nums[n-1]
 6         target = h
 7         while l <= h:
 8             mid = l + (h - l) // 2
 9             r = 0
10             for i in range(n):
11                 cur = nums[i]
12                 fix = 0#本题计算商的时候会向上进1,因此如果余数不为0,则商要+1
13                 if cur % mid != 0:
14                     fix += 1#余数不为0,商要+1
15                 r += cur // mid + fix
16             if r <= threshold:
17                 target = mid
18                 h = mid - 1
19             else:#r > threshold
20                 l = mid + 1
21         return target

算法思想:二分查找。

从1到nums中的最大值,作为左右边界。进行二分查找。

target默认为nums中的最大值,这样保证除数之和最小。(此时r=1 * n)

每次以mid作为除数计算目标值,并根据目标值与threshold的比较,进行二分查找。

注意第7行的判断条件是 l <= h。

posted on 2019-12-08 11:37  Sempron2800+  阅读(286)  评论(6编辑  收藏  举报