标签:tar 根据 lis 左右 sel 比较 style 二分 viso
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 13 if cur % mid != 0: 14 fix += 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。
本周比较顺利的完成了3道题目,1284是hard难度,考虑了一下没有思路,放弃了。
标签:tar 根据 lis 左右 sel 比较 style 二分 viso
原文地址:https://www.cnblogs.com/asenyang/p/12005132.html