【二分查找】leetcode 1552. 两球之间的磁力

1552. 两球之间的磁力

题目描述

在代号为 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,mid1]

代码

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)。即为排序需要的栈空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值