开始没思路。。。
看了一下别人用的是二分,才恍然大悟,二分的经典题型
解法:二分------------->O(mlogn)
满足条件的最小值->二分没错了!
1:mid过小->大于n
2:mid过大->小于n
3:left指向小于n的位置,right指向大于等于n的位置 最终return right
class Solution {
public:
bool larger(vector<int>& quantities, int m, int n);
int minimizedMaximum(int n, vector<int>& quantities) {
int left = 0, right = INT_MIN; //right 应该取数组中的最大值+1,而不是最小值+1!!!
for (auto& each : quantities) {
right = max (each, right);
}
right += 1;
while (left + 1 < right) {
int mid = left + (right - left) / 2;
if (larger(quantities, mid, n)) right = mid;
else left = mid;
}
return right;
}
};
bool Solution::larger(vector<int>& quantities, int m, int n) {
int sum = 0;
for (auto& each : quantities) {
sum += ceil(double(each) / double(m)); //格式!!!
}
if (sum <= n) return true;
return false;
}
易错点:
1:right 应该取数组中的最大值+1,而不是最小值+1 ,因为结果可能取到比最小值更大的值!!!
2:向上取整的格式:ceil(double(a) / double(b)) 在做除法之前就进行类型转换!!!