1979-找出数组的最大公约数

Raphael Liu Lv10

给你一个整数数组 nums ,返回数组中最大数和最小数的 最大公约数

两个数的 最大公约数 是能够被两个数整除的最大正整数。

示例 1:

**输入:** nums = [2,5,6,9,10]
**输出:** 2
**解释:**
nums 中最小的数是 2
nums 中最大的数是 10
2 和 10 的最大公约数是 2

示例 2:

**输入:** nums = [7,5,6,8,3]
**输出:** 1
**解释:**
nums 中最小的数是 3
nums 中最大的数是 8
3 和 8 的最大公约数是 1

示例 3:

**输入:** nums = [3,3]
**输出:** 3
**解释:**
nums 中最小的数是 3
nums 中最大的数是 3
3 和 3 的最大公约数是 3

提示:

  • 2 <= nums.length <= 1000
  • 1 <= nums[i] <= 1000

方法一:按要求计算

思路与算法

我们首先遍历数组 nums 得到最大值与最小值后,再计算两者的最大公约数即可。

对于计算最大公约数的部分,C++ 与 Python 的标准库中都有计算两个整数最大公约数的函数。

最大公约数的求法

计算两个整数最大公约数 gcd}(a, b) 的一种常见方法是欧几里得算法,即辗转相除法。其核心部分为:

\text{gcd}(a, b) = \text{gcd}(b, a\ \text{mod}\ b).

代码

[sol1-C++]
1
2
3
4
5
6
7
8
class Solution {
public:
int findGCD(vector<int>& nums) {
int mx = *max_element(nums.begin(), nums.end());
int mn = *min_element(nums.begin(), nums.end());
return gcd(mx, mn);
}
};
[sol1-Python3]
1
2
3
4
5
6
import math

class Solution:
def findGCD(self, nums: List[int]) -> int:
mx, mn = max(nums), min(nums)
return math.gcd(mx, mn)

复杂度分析

  • 时间复杂度:O(n + \log M),其中 n 为 nums 的长度,M 为 nums 的最大值。遍历数组寻找最大值与最小值的时间复杂度为 O(n),计算最大公约数的时间复杂度为 O(\log M)。

  • 空间复杂度:O(1)。

 Comments
On this page
1979-找出数组的最大公约数