题目地址:
https://leetcode.com/problems/find-the-smallest-divisor-given-a-threshold/description/
给定一个长 n n n的正整数数组 A A A,再给定一个大于等于 n n n的正整数 t t t,求使得 ∑ i ⌈ A [ i ] s ⌉ ≤ t \sum_i \lceil \frac{A[i]}{s} \rceil \le t ∑i⌈sA[i]⌉≤t的最小的 s s s。
思路是二分。代码如下:
class Solution {
public:
int smallestDivisor(vector<int>& a, int threshold) {
int l = 1, r = 0;
for (int x : a) r = max(r, x);
while (l < r) {
int mid = l + (r - l >> 1);
int sum = 0;
for (int x : a) sum += (x + mid - 1) / mid;
if (sum <= threshold) r = mid;
else l = mid + 1;
}
return l;
}
};
时间复杂度 O ( n log max A ) O(n\log \max A) O(nlogmaxA),空间 O ( 1 ) O(1) O(1)。