zoukankan      html  css  js  c++  java
  • leetcode1283

     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。

  • 相关阅读:
    selenium 难定位元素、时间插件
    列表生成式
    三元表达式
    监控日志
    非空即真
    深拷贝浅拷贝
    元组
    list字典嵌套
    2021
    布尔类型
  • 原文地址:https://www.cnblogs.com/asenyang/p/12005132.html
Copyright © 2011-2022 走看看