【算法题】2513. 最小化两个数组中的最大值

题目:

给你两个数组 arr1 和 arr2 ,它们一开始都是空的。你需要往它们中添加正整数,使它们满足以下条件:

arr1 包含 uniqueCnt1 个 互不相同 的正整数,每个整数都 不能 被 divisor1 整除 。
arr2 包含 uniqueCnt2 个 互不相同 的正整数,每个整数都 不能 被 divisor2 整除 。
arr1 和 arr2 中的元素 互不相同 。
给你 divisor1 ,divisor2 ,uniqueCnt1 和 uniqueCnt2 ,请你返回两个数组中 最大元素 的 最小值 。

示例 1:

输入:divisor1 = 2, divisor2 = 7, uniqueCnt1 = 1, uniqueCnt2 = 3
输出:4
解释:
我们可以把前 4 个自然数划分到 arr1 和 arr2 中。
arr1 = [1] 和 arr2 = [2,3,4] 。
可以看出两个数组都满足条件。
最大值是 4 ,所以返回 4 。
示例 2:

输入:divisor1 = 3, divisor2 = 5, uniqueCnt1 = 2, uniqueCnt2 = 1
输出:3
解释:
arr1 = [1,2] 和 arr2 = [3] 满足所有条件。
最大值是 3 ,所以返回 3 。
示例 3:

输入:divisor1 = 2, divisor2 = 4, uniqueCnt1 = 8, uniqueCnt2 = 2
输出:15
解释:
最终数组为 arr1 = [1,3,5,7,9,11,13,15] 和 arr2 = [2,6] 。
上述方案是满足所有条件的最优解。

提示:

2 <= divisor1, divisor2 <= 10^5
1 <= uniqueCnt1, uniqueCnt2 < 10^9
2 <= uniqueCnt1 + uniqueCnt2 <= 10^9

java 代码:

class Solution {
    public int minimizeSet(int divisor1, int divisor2, int uniqueCnt1, int uniqueCnt2) {
    	// 计算数1所要求的最大数(队列1大小加上队列1不能要的数)
    	int max1 = uniqueCnt1 + (uniqueCnt1-1)/(divisor1-1);
    	// 计算数2所要求的最大数(队列2大小加上队列2不能要的数)
    	int max2 = uniqueCnt2 + (uniqueCnt2-1)/(divisor2-1);
    	// 两数的最小公倍数
    	long lcm =  1L*divisor2 / gcd(divisor1,divisor2) *divisor1;
    	// 计算他们最小公倍数所要求的最大数(两个队列所有数加上两个队列都不能要的数)
    	int max3 = (int) (uniqueCnt1 + uniqueCnt2 + (uniqueCnt1+uniqueCnt2-1)/(lcm-1));
    	// 所有最大数中,取最大的。
    	return Math.max(max3,  Math.max(max1, max2));

    }

    // 计算最大公约数 --辗转相除法
	private int gcd(int divisor1, int divisor2) {
		if(divisor1 == divisor2) {
			return divisor2;
		}
		return divisor1 > divisor2?gcd(divisor2,divisor1-divisor2):gcd(divisor1,divisor2-divisor1);
	}
}

你可能感兴趣的:(leetcode-数组,算法,java,开发语言)