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

182 阅读1分钟

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

题目 leetcode.cn/

  • 给你一个整数数组 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

代码

function findGCD(nums: number[]): number {
    let max = Math.max(...nums);
    let min = Math.min(...nums);
    let maxArr = [];
    for(let i = max; i >= 1; i--){
        if(max%i === 0){
            maxArr.push(i)
        }
    }
    let minArr = [];
    for(let k = min; k >= 1; k--){
        if(min%k === 0){
            minArr.push(k)
        }
    }
    if(maxArr.length > minArr.length){
        for(let i = 0; i < minArr.length; i++){
            if(maxArr.includes(minArr[i])){
                return minArr[i]
            }
        }
    }else{
        for(let i = 0; i < maxArr.length; i++){
            if(minArr.includes(maxArr[i])){
                return maxArr[i]
            }
        }
    }
};
  • 暴力解法:
    • 数组内最大值和最小值得最大公约数,首先可以将数组的最大值和最小值都找出来
    • 然后分别对其求出所有的公约数,保存在各自维护的数组变量中
    • 然后遍历求出最大的共同的公约数
    • 方法遍历了三次,时间空间复杂度较高,但是思路不复杂
function findGCD(nums: number[]): number {
    let newNums = nums.sort((a, b) => { return a - b; });
    for(let i = newNums[0]; i >= 1; i--){
        if(newNums[0] % i === 0 && newNums[newNums.length - 1] % i === 0){
            return i;
        }
    }
};
  • 改进版:
    • 首先将原数组按照升序排序,这样最大值在数组的最后一位,最小值在数组的第一位
    • 然后按照最小值的范围遍历取值,因为最大值和最小值的最大公约数的范围是按照最小值得范围来确定的,就是短板效应
    • 如果当前的取值i既是最小值得公约数,又是最大值的公约数,那么i就是数组最大值和最小值的最大公约数