天天看点

Leetcode: 俩球之间的磁力

题目

在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子,第 i 个篮子的位置在 position[i] ,Morty 想把 m 个球放到这些篮子里,使得任意两球间 最小磁力 最大。

已知两个球如果分别位于 x 和 y ,那么它们之间的磁力为 |x - y| 。

给你一个整数数组 position 和一个整数 m ,请你返回最大化的最小磁力。

示例:

输入:position = [1,2,3,4,7], m = 3
输出:3
解释:将 3 个球分别放入位于 1,4 和 7 的三个篮子,两球间的磁力分别为 [3, 3, 6]。最小磁力为 3 。我们没办法让最小磁力大于 3 。      
输入:position = [5,4,3,2,1,1000000000], m = 2
输出:999999999
解释:我们使用位于 1 和 1000000000 的篮子时最小磁力最大。      

解题思路

1.两球的最小距离的最小值,是1;最小距离的最大值是 (最后位置的球坐标 - 最前位置的球坐标) / (球数-1),这里需要先对position数组排序,那么易得最小球间距离的最大值为 (position[position.length - 1] - position[0]) / (m-1)。

2.有最小和最大,直觉想到二分法。以二分的中间值,作为间距去摆放球。如果摆放的球数 >=m, 可认为需要增加球间距 (同时保存中间值作为候选答案); 否则需要减少球间距。

代码实现

class Solution {
    public int maxDistance(int[] position, int m) {
        Arrays.sort(position);
        int left = 1, right = position[position.length - 1] - position[0], ans = -1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (check(mid, position, m)) {
                ans = mid;
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return ans;
    }

    public boolean check(int x, int[] position, int m) {
        int pre = position[0], cnt = 1;
        for (int i = 1; i < position.length; i++) {
            if (position[i] - pre >= x) {
                pre = position[i];
                cnt += 1;
            }
        }
        return cnt >= m;
    }
}      

最后

  • 时间复杂度:O(nlog(nS)),其中 n 为篮子的个数,S 为篮子位置的上限。
  • 空间复杂度:O(logn),即为排序需要的栈空间。
  • ​​# UE4:来为我们的角色制作一个血条吧​​
  • ​​使用 Google Breakpad 来助力解决程序崩溃​​
  • ​​UE4 多人游戏服务器探索​​
  • ​​使用虚幻引擎自动化工具实现自动化部署​​
  • ​​如何在 UE4 中制作一扇自动开启的大门​​
  • ​​如何在 UE4 中用代码去控制角色移动​​
  • ​​如何给 UE4 场景添加游戏角色​​
  • ​​UE4:Android 平台开发实践指南​​
  • ​​UE4 开发避坑指南(持续更新)​​
  • ​​新年开工啦,放个小烟花庆祝一下​​
  • ​​聊聊与苹果审核员的爱恨情仇(下)​​
  • ​​聊聊与苹果审核员的爱恨情仇(上)​​
  • ​​一名普通工具人的 2021 | 2021年终总结​​
  • ​​二叉树刷题总结:二叉搜索树的属性​​
  • ​​二叉树总结:二叉树的属性​​
  • ​​二叉树总结:二叉树的修改与构造​​
  • ​​StoreKit2 有这么香?嗯,我试过了,真香​​
  • ​​看完这篇文章,再也不怕面试官问我如何构造二叉树啦!​​
  • ​​那帮做游戏的又想让大家氪金,太坏了!​​
  • ​​手把手带你撸一个网易云音乐首页 | 适配篇​​
  • ​​手把手带你撸一个网易云音乐首页(三)​​
  • ​​手把手带你撸一个网易云音乐首页(二)​​
  • ​​手把手带你撸一个网易云音乐首页(一)​​
  • ​​代码要写注释吗?写你就输了​​
  • ​​Codable发布这么久我就不学,摸鱼爽歪歪,哎~就是玩儿​​
  • ​​iOS 优雅的处理网络数据,你真的会吗?不如看看这篇​​
  • ​​UICollectionView 自定义布局!看这篇就够了​​
  1. 关注公众号--- HelloWorld杰少