Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 01be755

Browse files
🐱(binary-search): 1283. 使结果不超过阈值的最小除数
1 parent c413cb9 commit 01be755

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

‎docs/algorithm/research/binary-search/README.md‎

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,4 +1240,58 @@ class Solution:
12401240
right = mid - 1
12411241

12421242
return -1
1243+
```
1244+
1245+
## 1283. 使结果不超过阈值的最小除数
1246+
1247+
[原题链接](https://leetcode-cn.com/problems/find-the-smallest-divisor-given-a-threshold/)
1248+
1249+
### 读题
1250+
1251+
简单得说,就是找到一个正整数 `x`,把 `nums` 中的数依次除以该数,相加之和 `total` 需要小于阈值 `threshold`,且要求 `x` 最小。可知当 `total` 越接近 `threshold` 时,`x` 越小。
1252+
1253+
### 思路
1254+
1255+
因为数据量的原因(1 <= nums.length <= 5 * 10^4),我们不能通过暴力破解枚举所有可能的 `x`,可以想到应当使用二分查找,那么二分查找的区间如何定义呢?
1256+
1257+
左侧值 `left` 选取最小正整数 1,而右侧值 `right` 可以选择数组 `nums` 中的最大数 `max(nums)`。当 `x` 取值为 `max(nums)` 时,结果和 `total` 等于数组长度,若此时 `x` 再继续增加,`total` 则始终保持不变。因此右侧区间取值 `max(nums)`,再取更大的值则没有意义。
1258+
1259+
### 实现
1260+
1261+
```go
1262+
func smallestDivisor(nums []int, threshold int) int {
1263+
// 寻找最大数
1264+
maxNum := 1
1265+
for _, num := range nums {
1266+
if num > maxNum {
1267+
maxNum = num
1268+
}
1269+
}
1270+
1271+
left := 1
1272+
right := maxNum
1273+
ans := 0
1274+
for left <= right {
1275+
mid := (left + right) / 2
1276+
// 计算总数
1277+
total := 0
1278+
for _, num := range nums {
1279+
total += num / mid
1280+
if num % mid > 0 {
1281+
total += 1
1282+
}
1283+
}
1284+
1285+
if total <= threshold {
1286+
// 找到满足条件的 mid 了,但还希望能找到更小的:往左边找
1287+
right = mid - 1
1288+
ans = mid
1289+
} else {
1290+
// total 太大了,应该要提高 mid:往右边找
1291+
left = mid + 1
1292+
}
1293+
}
1294+
1295+
return ans
1296+
}
12431297
```

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /