5920. 分配给商店的最多商品的最小值

二分法

看题目给出的范围,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;
    }
原文地址:https://www.cnblogs.com/Frank-Hong/p/15519477.html