算法:二分查找+贪心
- 由题可知,数组position排序后不影响反而利于解题。所以先sort()就对了
- 排好序后,头left尾right
int right=position.back()-position.front();
表示篮子之间的最大距离
- 假设答案是
mid = (left+right) >> 1;
- 那么答案成立的首要条件就是
省略号表示若干篮子
当d1,d2,d3…都大于等于distance时,包括distance共count(大于m)个差值,distance就是题目所说的最小磁力
- 当二分搜索循环到
left>right
时,求得的mid=distance
就是最大的最小磁力
class Solution {
public:
bool check(int mid, vector<int>& pos, int m){
int pre = pos[0];
int count = 1;
for(int i=1; i<pos.size(); i++)
{
if(pos[i]-pre>=mid)
{
pre = pos[i];
count++;
}
}
return count>=m;
}
int maxDistance(vector<int>& position, int m) {
sort(position.begin(),position.end());
int left = 1;
int right = position.back()-position.front();
int ans=-1;
while(left<=right){
int mid = (left+right)/2;
if(check( mid, position, m))
{
left = mid+1;
ans = mid;
}
else{
right = mid-1;
}
}
return ans;
}
};