
题目描述
给你一个整数数组 nums。
选择 恰好一对 不同下标 i 和 j。该数对的 强度 定义为:
(nums[i] * nums[j]) / gcd(nums[i], nums[j])2
返回所有可能数对中的 最大 强度。
gcd(a, b) 表示 a 和 b 的 最大公约数 。
示例 1:
输入: nums = [2,3,5]
输出: 15
解释:
选择 i = 1 和 j = 2,得到强度:
(3 * 5) / gcd(3, 5)2 = 15 / 1 = 15,这是所有数对中的最大值。
示例 2:
输入: nums = [4,6,8]
输出: 12
解释:
选择 i = 1 和 j = 2,得到强度:
(6 * 8) / gcd(6, 8)2 = 48 / 4 = 12,这是所有数对中的最大值。
示例 3:
输入: nums = [3,3]
输出: 1
解释:
选择 i = 0 和 j = 1,得到强度:
(3 * 3) / gcd(3, 3)2 = 9 / 9 = 1,这是唯一数对的强度。
提示:
2 <= nums.length <= 2000 1 <= nums[i] <= 105
解法
方法一:枚举
我们直接枚举所有的数对 \((i, j)\),其中 \(i < j\),计算每个数对的强度 \(\frac{\textit{nums}[i] \times \textit{nums}[j]}{\gcd(\textit{nums}[i], \textit{nums}[j])^2}\),取最大值即可。
其中,最大公约数 \(\gcd\) 可以使用辗转相除法求得。
时间复杂度 \(O(n^2 \times \log M)\),其中 \(n\) 是数组 \(\textit{nums}\) 的长度,而 \(M\) 是数组元素的最大值。空间复杂度 \(O(1)\)。
| class Solution:
def maxPairStrength(self, nums: list[int]) -> int:
n = len(nums)
ans = 0
for i in range(n):
for j in range(i + 1, n):
x = nums[i] * nums[j] // gcd(nums[i], nums[j]) ** 2
ans = max(ans, x)
return ans
|
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 | class Solution {
public long maxPairStrength(int[] nums) {
int n = nums.length;
long ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
long g = gcd(nums[i], nums[j]);
long x = (long) nums[i] * nums[j] / (g * g);
ans = Math.max(ans, x);
}
}
return ans;
}
private long gcd(long a, long b) {
while (b != 0) {
long t = a % b;
a = b;
b = t;
}
return a;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | class Solution {
public:
long long maxPairStrength(vector<int>& nums) {
int n = nums.size();
long long ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
long long g = gcd(nums[i], nums[j]);
long long x = 1LL * nums[i] * nums[j] / (g * g);
ans = max(ans, x);
}
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | func maxPairStrength(nums []int) int64 {
n := len(nums)
var ans int64 = 0
for i := 0; i < n; i++ {
for j := i + 1; j < n; j++ {
g := gcd(int64(nums[i]), int64(nums[j]))
x := int64(nums[i]) * int64(nums[j]) / (g * g)
ans = max(ans, x)
}
}
return ans
}
func gcd(a, b int64) int64 {
for b != 0 {
a, b = b, a%b
}
return a
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | function maxPairStrength(nums: number[]): number {
const n = nums.length;
let ans = 0;
for (let i = 0; i < n; i++) {
for (let j = i + 1; j < n; j++) {
const g = gcd(nums[i], nums[j]);
const x = Math.floor((nums[i] * nums[j]) / (g * g));
ans = Math.max(ans, x);
}
}
return ans;
}
function gcd(a: number, b: number): number {
while (b !== 0) {
const t = a % b;
a = b;
b = t;
}
return a;
}
|