解题思路:
1.暴力求解(超出时间限制)
注意向上取整
2.优化(二分查找)
代码1:暴力
class Solution {
public:
int smallestDivisor(vector<int>& nums, int threshold)
{
int sz = nums.size();
int div = 0;
int sum = 0;
do
{
++div;
sum = 0;
for(int i = 0 ;i < sz;++i)
{
sum += (nums[i]+div-1) / div;
}
}while(sum > threshold);
return div;
}
};
代码2:二分
class Solution {
public:
int smallestDivisor(vector<int>& nums, int threshold)
{
int sz = nums.size();
int left = 1;
int right = *max_element(nums.begin(), nums.end());
int ans = 0;
int sum = 0;
while (left <= right)
{
int mid = (left + right) / 2;
sum = 0;
for (int i = 0; i < sz; ++i)
{
sum += (nums[i] + mid - 1) / mid;//向上取整
}
if (sum <= threshold)//条件成立,找到最小的值
{
ans = mid;
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return ans;
}
};