二分法
看题目给出的范围,O(n^2)的时间复杂度肯定会超时,O(n)时间复杂度的算法又没思路,这个时候不妨试试O(n*logn)的时间复杂度,也即利用二分法。
不得感叹二分法的强大,这也为暴力搜索提供了一种新的思路————即利用二分法将结果试出来。
具体到这题的做法就是利用二分法在1到1e5的范围内求出最小满足条件的x,什么叫满足条件呢,即在保证每家商店商品数量不超过x的情况下需要的商店数目不能超过n。
public int minimizedMaximum(int n, int[] quantities) {
int left = 1, right = 100000;
while (left <= right) {
int mid = (left + right) / 2;
int count = 0;//需要的最少商店数目
for (int quantity : quantities) {
count += (quantity + mid - 1) / mid;//向上取整
}
if (count > n) {
left = mid + 1;//不满足条件
} else {
right = mid - 1;
}
}
return left;
}