LeetCode 题解工作台
使结果不超过阈值的最小除数
给你一个整数数组 nums 和一个正整数 threshold ,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。 请你找出能够使上述结果小于等于阈值 threshold 的除数中 最小 的那个。 每个数除以除数后都向上取整,比方说 7/3 = 3 , 10/2 = 5 。…
2
题型
8
代码语言
3
相关题
当前训练重点
中等 · 二分·搜索·答案·空间
答案摘要
我们注意到,对于一个数字 ,如果将 中的每个数字都除以 的结果之和小于等于 ,那么所有大于 的值都满足条件。这存在着单调性,因此我们可以使用二分查找的方法找到最小的满足条件的 。 我们定义二分查找的左边界 , ,每次取 ,计算 中每个数字除以 的结果之和 ,如果 小于等于 ,那么说明 满足条件,我们将 更新为 ,否则将 更新为 。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 二分·搜索·答案·空间 题型思路
题目描述
给你一个整数数组 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^41 <= nums[i] <= 10^6nums.length <= threshold <= 10^6
解题思路
方法一:二分查找
我们注意到,对于一个数字 ,如果将 中的每个数字都除以 的结果之和小于等于 ,那么所有大于 的值都满足条件。这存在着单调性,因此我们可以使用二分查找的方法找到最小的满足条件的 。
我们定义二分查找的左边界 , ,每次取 ,计算 中每个数字除以 的结果之和 ,如果 小于等于 ,那么说明 满足条件,我们将 更新为 ,否则将 更新为 。
最后返回 即可。
时间复杂度 ,其中 是数组 的长度,而 是数组 中的最大值。空间复杂度 。
class Solution:
def smallestDivisor(self, nums: List[int], threshold: int) -> int:
def f(v: int) -> bool:
v += 1
return sum((x + v - 1) // v for x in nums) <= threshold
return bisect_left(range(max(nums)), True, key=f) + 1
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | Depends on the final approach |
| 空间 | Depends on the final approach |
面试官常问的追问
外企场景- question_mark
The candidate's understanding of binary search is key for solving this problem efficiently.
- question_mark
Look for the candidate's ability to implement efficient summation and handle large inputs.
- question_mark
Pay attention to how the candidate handles edge cases and adjusts the binary search bounds correctly.
常见陷阱
外企场景- error
Misunderstanding the rounding behavior during division may lead to incorrect sums.
- error
Inefficient summation of array elements for each divisor choice could slow down the solution.
- error
Not adjusting the search bounds correctly during binary search could result in suboptimal solutions or failure to find the correct divisor.
进阶变体
外企场景- arrow_right_alt
If the array contains only one element, the problem simplifies to finding the smallest divisor for that element alone.
- arrow_right_alt
Consider cases where the threshold is very large, potentially requiring a larger divisor.
- arrow_right_alt
Extend the problem to handle floating-point numbers or more complex rounding rules.