题目描述
在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子,第 i 个篮子的位置在 position[i] ,Morty 想把 m 个球放到这些篮子里,使得任意两球间 最小磁力 最大。
已知两个球如果分别位于 x 和 y ,那么它们之间的磁力为 |x - y| 。
给你一个整数数组 position 和一个整数 m ,请你返回最大化的最小磁力。
示例1:
输入: position = [1,2,3,4,7], m = 3
输出: 3
解释: 将 3 个球分别放入位于 1,4 和 7 的三个篮子,两球间的磁力分别为 [3, 3, 6]。最小磁力为 3 。我们没办法让最小磁力大于 3 。
示例2:
输入: position = [5,4,3,2,1,1000000000], m = 2
输出: 999999999
解释: 我们使用位于 1 和 1000000000 的篮子时最小磁力最大。
提示
- n = = p o s i t i o n . l e n g t h n == position.length n==position.length
- 2 < = n < = 1 0 5 2 <= n <= 10^5 2<=n<=105
- 1 < = p o s i t i o n [ i ] < = 1 0 9 1 <= position[i] <= 10^9 1<=position[i]<=109
- 所有 p o s i t i o n 中的整数互不相同 所有 position 中的整数 互不相同 所有position中的整数互不相同
- 2 < = m < = p o s i t i o n . l e n g t h 2 <= m <= position.length 2<=m<=position.length
方法:二分查找
解题思路
由题意可知,两球之间的磁力越小,可以放入篮子里面的球就越多;两球之间的磁力越大,可以放入篮子里面的球就越少。本题具有单调性,首先对 position 数组排序,然后可以利用二分查找来解决。
题目求最大化的最小磁力,意思是在放入篮子里 m 个球的情况下,两球之间的最大磁力。磁力的取值的左边界为 1,右边界为 position 最后一个元素减去第一个元素。
判断 mid 的取值是否符合条件:用当前篮子的位置减去前一个篮子的位置,即两球之间的距离大于等于 mid,则在当前篮子的位置上又放入了一个球,如果已成功放入 m 个球,则 mid 符合条件,将区间缩小为 [ m i d , r i g h t ] [mid,right] [mid,right];反之,mid 不符合条件,将区间缩小为 [ l e f t , m i d − 1 ] [left,mid-1] [left,mid−1]。
代码
class Solution {
public:
bool check(vector<int>& position, int mid, int m) {
int prev = position[0];
int cnt = 1;
for(int i = 1; i < position.size(); i++)
{
if(position[i] - prev >= mid)
{
cnt++;
prev = position[i];
if(cnt == m) return true;
}
}
return false;
}
int maxDistance(vector<int>& position, int m) {
sort(position.begin(), position.end());
int l = 1, r = position.back() - position[0], mid;
while(l < r)
{
mid = (l + r + 1) >> 1;
if(check(position, mid, m))
l = mid;
else
r = mid - 1;
}
return l;
}
};
复杂度分析
- 时间复杂度: O ( n log ( n S ) ) O(n\log (nS)) O(nlog(nS)),其中 n 为篮子的个数,S 为篮子位置的上限。对篮子位置排序需要 O ( n log n ) O(n\log n) O(nlogn) 的时间复杂度,二分查找对篮子位置间隔进行二分,需要 O ( log S ) O(\log S) O(logS) 的时间复杂度。每次统计答案是否符合要求需要 O ( n ) O(n) O(n) 的时间复杂度,因此总时间复杂度为 O ( n log n + n log S ) = O ( n log ( n S ) ) O(n\log n+n\log S) = O(n\log (nS)) O(nlogn+nlogS)=O(nlog(nS))。
- 空间复杂度: O ( l o g n ) O(logn) O(logn)。即为排序需要的栈空间。