leetcode
leetcode 1751 ~ 1800
找出数组的最大公约数

找出数组的最大公约数

难度:

标签:

题目描述

代码结果

运行时间: 23 ms, 内存: 16.1 MB


/*
 * 题目思路:
 * 1. 使用Stream找到数组中的最大数和最小数。
 * 2. 使用辗转相除法求最大公约数。
 */

import java.util.Arrays;

public class Solution {
    public int findGCD(int[] nums) {
        int min = Arrays.stream(nums).min().getAsInt();
        int max = Arrays.stream(nums).max().getAsInt();
        return gcd(min, max);
    }

    // 辗转相除法求最大公约数
    private int gcd(int a, int b) {
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }
}

解释

方法:

此题解的思路是直接找出给定数组中的最大值和最小值,然后使用 Python 的内置库函数 math.gcd 来计算这两个数的最大公约数。这种方法利用了最大公约数的性质,即最大公约数仅与数组的最大值和最小值有关,不需要考虑数组中的其他元素。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
题解中提到查找数组中的最大值和最小值需要遍历整个数组两次,是否有更高效的方法在单次遍历中同时确定最大值和最小值?
是的,可以通过单次遍历数组来同时找出最大值和最小值。具体方法是初始化两个变量,一个用于存储当前的最大值,另一个用于存储当前的最小值。在遍历数组的过程中,对每个元素进行比较,更新最大值和最小值。这样,只需遍历一次数组,即可得到所需的最大值和最小值,从而提高了效率。
🦆
题解假设了输入数组的长度至少为2,如果只有一个元素的情况是否应该考虑在解题思路中?
确实,题解应该考虑数组只有一个元素的情况。在这种情况下,数组的唯一元素的最大公约数是其自身。解决方案可以简单地返回这个单一元素作为其最大公约数。这种情况下,最大值和最小值都是该单一元素,因此直接返回该元素即可。
🦆
在实际应用中如何处理可能出现的输入数据错误,例如数组中包含负数或零的情况?
在处理输入数据时,应首先验证数组是否包含非整数或数组为空的情况,并适当处理这些错误。对于包含零和负数的情况,math.gcd函数可以正确处理,因为它按照数学原理计算任意两个整数的最大公约数。然而,如果业务逻辑不希望处理零或负数,可以在计算前添加检查,确保所有元素都是正整数,并在发现非法输入时抛出错误或返回特定的错误信息。

相关问题