LeetCode解析------5489. 两球之间的磁力-二分查找

题目:

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

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

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

示例 1:
LeetCode解析------5489. 两球之间的磁力-二分查找_第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 == position.length
2 <= n <= 10^5
1 <= position[i] <= 10^9
所有 position 中的整数 互不相同 。
2 <= m <= position.length

简单介绍:
题目:两球之间的磁力
题目难度:中等
使用语言:JAVA
这道题来自leetcode题库的二分查找标签。

解题思路:
核心解法:二分搜索。

-首先,对数组进行排序。
-其次,找到磁力的边界。即任意两球最大磁力与最小磁力。最大磁力是position[length-1]-position[0]/(m-1)。最小磁力是1。
-接下来,采用我们的核心算法,二分查找。查找最小磁力的最大值。
-设置check函数,如果当前距离可以放下m个或多于m个球,则返回true;否则返回false。
-如果当前距离可以放下放下m个或多于m个球,则让距离往右移动;否则往左移动。

数据结构:
要实现对数据的操作,我们要先明确存储数据的数据结构。
该题的数据结构的作用:
1.整型保存边界与结果

算法:
既然明确了我们的数据结构,我们就可以开始我们的算法分析了。
1.第一步,初始化工作,设置变量,对数组排序。
2.第二步,二分查找。
3.第三步,返回结果

代码部分:


public class Solution {
    public int maxDistance(int[] position, int m) {

        Arrays.sort(position);
        int length=position.length;

        //最大距离和最小距离
        int high=position[length-1]-position[0]/(m-1);
        int low=1;

        int res=1;
        while(low<=high){
            int mid=low+(high-low)/2;

            if(check(position,mid,m)){
                res=mid;
                low=mid+1;
            }else{
                high=mid-1;
            }
        }
        return res;
    }

    //如果当前distance可以放下m个球,则返回true,否则返回false
    public boolean check(int[] position,int distance,int m){
        int count=1;
        int i=0;
        for(int j=1;j<position.length;j++){
            if(position[j]-position[i]>=distance){
                i=j;
                count++;
                if(count>=m) return true;
            }
        }

        return false;
    }
}



时间、空间复杂度:

LeetCode解析------5489. 两球之间的磁力-二分查找_第2张图片

结语:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!

你可能感兴趣的:(leetcode,编程算法)