[杨小白]_leetcode_力扣_第 94 场双周赛-第三题

96 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标2000分,现在1995!!

力扣第 94 场双周赛-力扣

第 94 场双周赛

上2000无望了,反而掉分,又掉20分,大寄啊!!

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 <= 105
  • 1 <= uniqueCnt1, uniqueCnt2 < 109
  • 2 <= uniqueCnt1 + uniqueCnt2 <= 109

代码

被绕进去了,加加减减一直没搞清楚。

把数据分为四种,然后二分做

(1). 既可以放到数组1和数组2中的数
(2). 只能放到数组1
(3). 只能放到数组2
(4). 数组1与数组2都不可以放置
import java.math.BigInteger;
class Solution {
	public int minimizeSet(int divisor1, long divisor2, int uniqueCnt1, int uniqueCnt2) {
		long left = 1, right = 2000000000;
		while (left < right) {
			long mid = (left + right) / 2;
            long count = mid
					/ (divisor1 * divisor2 / BigInteger.valueOf(divisor1).gcd(BigInteger.valueOf(divisor2)).intValue());
			if (mid - mid / divisor1 - mid / divisor2 + count < Math.max(0, uniqueCnt1 - mid / divisor2 + count)
					+ Math.max(0, uniqueCnt2 - mid / divisor1 + count)) {
				left = mid + 1;
			} else {
				right = mid;
			}
		}
		return (int) left;
	}
}

3.结束

第三题被绕进去没绕出来,掉分。

image.png