3334. 数组的最大因子得分

给你一个整数数组 nums

因子得分 定义为数组所有元素的最小公倍数(LCM)与最大公约数(GCD)的 乘积

最多 移除一个元素的情况下,返回 nums最大因子得分

注意,单个数字的 LCM 和 GCD 都是其本身,而 空数组 的因子得分为 0。

lcm(a, b) 表示 ab最小公倍数

gcd(a, b) 表示 ab最大公约数

示例 1:

输入: nums = [2,4,8,16]

输出: 64

解释:

移除数字 2 后,剩余元素的 GCD 为 4,LCM 为 16,因此最大因子得分为 4 * 16 = 64

示例 2:

输入: nums = [1,2,3,4,5]

输出: 60

解释:

无需移除任何元素即可获得最大因子得分 60。

示例 3:

输入: nums = [3]

输出: 9

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
public long gcd(long a, long b) {
if (b == 0) return a;
return gcd(b, a % b);
}
public long lcm(long a, long b) {
return a * b / gcd(a, b);
}
public long maxScore(int[] nums) {
int n = nums.length;
Arrays.sort(nums);
long[] preGcd = new long[n + 1];
long[] preLcm = new long[n + 1];
long[] sufGcd = new long[n + 1];
long[] sufLcm = new long[n + 1];
preLcm[0] = 1;
for (int i = 0; i < n; i++) {
preGcd[i + 1] = gcd(preGcd[i], nums[i]);
preLcm[i + 1] = lcm(preLcm[i], nums[i]);
}
sufLcm[n] = 1;
for (int i = n - 1; i >= 0; i--) {
sufGcd[i] = gcd(sufGcd[i + 1], nums[i]);
sufLcm[i] = lcm(sufLcm[i + 1], nums[i]);
}
long res = preGcd[n] * preLcm[n];
for (int i = 0; i < n; i++) {
long g = gcd(preGcd[i], sufGcd[i+1]);
long l = lcm(preLcm[i], sufLcm[i+1]);
res = Math.max(res, g*l);
}
return res;
}
}