259. 查找最大因子
描述
现在给你一个正整数数组A和一个正整数k。
希望你求出最大的因数d满足:
upper(a0 / d) + upper(a1 / d) + … + upper(a{n-1} / d) >= k
题目保证有解。
- 0 < |A| <= 1000
- 0 < A[i], k <= 1e9
- d为整数且不超过数组A中的最大值
- upper()是向上取整
样例 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
题解
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 = 1;
// 找到最大值用来当右边界
int max = Integer.MIN_VALUE;
for (int n : A) {
max = Math.max(max, n);
}
// 二分查找
int low = 1;
int high = max;
while (low < high
&& high > ret) {
int mid = (low + high) >>> 1;
int sum = 0;
for (int n : A) {
sum += (n + mid - 1) / mid;
if (sum >= k) {
// 提前结束循环
break;
}
}
if (sum >= k) {
ret = Math.max(ret, mid);
low = mid + 1;
} else {
high = mid;
}
}
return ret;
}
}
最后说两句
非常感谢你阅读本文章,如果你觉得本文对你有所帮助,请留下你的足迹,点个赞,留个言,多谢~
作者水平有限,如果文章内容有不准确的地方,请指正。
希望小伙伴们都能每天进步一点点。
声明
本文由二当家的白帽子博客原创,转载请注明来源,谢谢~