友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。
公众号的微信号是: jikerizhi 。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
1362. 最接近的因数
给你一个整数 num
,请你找出同时满足下面全部要求的两个整数:
-
两数乘积等于
num + 1
或num + 2
-
以绝对差进行度量,两数大小最接近
你可以按任意顺序返回这两个整数。
示例 1:
输入:num = 8 输出:[3,3] 解释:对于 num + 1 = 9,最接近的两个因数是 3 & 3;对于 num + 2 = 10, 最接近的两个因数是 2 & 5,因此返回 3 & 3 。
示例 2:
输入:num = 123 输出:[5,25]
示例 3:
输入:num = 999 输出:[40,25]
提示:
-
1 <= num <= 109+
思路分析
取两头的数字 1
和 num + 2
向中间挤压。
看题解,更好的办法是求 num + 2
的平方根。然后,向外开,能更快地找到解。
-
一刷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* @author D瓜哥 · https://www.diguage.com
* @since 2025-05-30 19:50:44
*/
public int[] closestDivisors(int num) {
int a = 1, b = num + 2;
int[] result = {a, b};
while (a <= b) {
int mul = a * b;
if (mul == num + 1 || mul == num + 2) {
if (b - a < result[1] - result[0]) {
result[0] = a;
result[1] = b;
}
} else if (mul < num + 1) {
int temp = (num + 1) / b;
if (temp > a) {
a = temp;
} else {
a++;
}
} else {
int tem = (num + 2) / a + 1;
if (tem < b) {
b = tem;
} else {
b--;
}
}
}
return result;
}