259. 查找最大因子
现在给你一个正整数数组A和一个正整数k。
希望你求出最大的因数d满足:
upper(a_0/d)+upper(a_1/d)+...+upper(a_{n-1}/d) >= k
u
p
p
e
r
(
a
0
/
d
)
+
u
p
p
e
r
(
a
1
/
d
)
+
.
.
.
+
u
p
p
e
r
(
a
n
−
1
/
d
)
>
=
k
题目保证有解。
样例
样例 1
输入:[1,2,3,4,5] 6
输出:4
解释:upper(1/4) = 1, upper(2/4) = 1, upper(3/4) = 1, upper(4/4) = 1, upper(5/4) = 2, 1+1+1+1+2 = 6
样例 2
输入:[5,15,20,25] 6
输出:19
解释:upper(5/19) = 1, upper(15/19) = 1, upper(20/19) = 2, upper(25/19) = 2, 1+1+2+2 = 6
注意事项
-
0<|A|<=1000
-
0<A[i], k<=1e9
-
d为整数且不超过数组A中的最大值
-
upper()是向上取整
public class Solution {
/**
* @param A: the array.
* @param k: the integer.
* @return: the divisor satisfy the requirement.
*/
public int FindDivisor(int[] A, int k) {
int ret = 0;
int max = 0;
int min = 0;
int mid;
for (int value : A) {
max = Math.max(max, value);
}
while (max > min) {
mid = (max + min) / 2;
// System.out.println(mid);
int sum = 0;
for (int value : A) {
sum += upper(value, mid);
}
if (sum >= k) {
ret = mid;
min = mid + 1;
} else {
max = mid;
}
}
return ret;
}
private int upper(int a, int b) {
if (a % b == 0) {
return a / b;
} else {
return a / b + 1;
}
}
}