组合公式【1552. 两球之间的磁力】

组合公式

从m 个箱子中选出 n 个箱子
公式:Cmn=m!n!(mn)!)
每种方式两两相邻球之间都有一个磁力,假设:

  • 放置方式1的两两相邻球之间的磁力的最小值为a
  • 放置方式2的两两相邻球之间的磁力的最小值为b
    ...
  • 放置方式X的两两相邻球之间的磁力的最小值为x
    那么本题的题解就是 max(a, b, ..., x)。即求最大的最小磁力。
    由于题目已经给了 n 个篮子的位置 position,我们先将 position 升序,则可得出:
  • 两球之间的磁力最大值 = position[n-1] - postion[0]
  • 由于数组每个值都不同,所以磁力最小值 = 1

接下来就可以用二分策略,求得一个中间值mid = (min + max) / 2,然后将mid值作为两球之间的最小间距dis,如果有放置策略可以满足所有两两相邻球之间的距离都大于等于dis,则dis就是本题的一个可能解。

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

整体代码:

class Solution {
	//	所有 position 中的整数 互不相同
    public int maxDistance(int[] position, int m) {	//	m 个球
		Arrays.sort(position);
		int max = position[position.length - 1] - position[0];
		int min = 1;
		int res= 1;
		while (min <= max){
			int mid = min + (max - min) / 2;
			if (isValid(position, mid, m)){	//	尽量大一些
				res = Math.max(res, mid);
				min = mid + 1;
			}else {
				max = mid - 1;
			}
		}
		return res;
	}
	public boolean isValid(int[] position, int len, int m){
		int count = 1;
		int pre = position[0];
		for (int i = 1; i < position.length; i++) {
			if (position[i] - pre >= len){
				count++;
				pre = position[i];
			}
		}
		return count >= m;
	}
}

换皮题【最佳植树距离】

import java.util.Scanner;
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
     Scanner in = new Scanner(System.in);
        int count = in.nextInt();
        int[] arr = new int[count];
        for (int i = 0; i < count; i++) {
            arr[i] = in.nextInt();
        }
        Arrays.sort(arr);
        int treeCount = in.nextInt();
        int min = 1;
        int max = arr[count - 1] - arr[0];
        int res = 1;
        while (min <= max){
            int mid = min + (max - min) / 2;
            if (isValid(arr, mid, treeCount)){
                res = Math.max(res, mid);
                min = mid + 1;
            }else {
                max = mid - 1;
            }
        }
        System.out.println(res);
    }
    public static boolean isValid(int[] arr, int len, int treeCount){
        int count = 1;
        int pre = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] - pre >= len){
                count++;
                pre = arr[i];  //  更新 pre
            }
        }
        return count >= treeCount;
    }
}
posted @   爱新觉罗LQ  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示