Leetcode----最大公约数

180 阅读1分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路

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

leetcode-cn.com/problems/fi…](leetcode-cn.com/problems/fi…)

 

三种方法

1.暴力枚举  

枚举 [1,a],找出(a%i==0)&&(b%i==0) 中的i的最大时间复杂度为O(a)。

int gcd(int a,int b)
{
    int max=0;
   for(int i=1;i<=a;i++)
   {
       if(a%i==0&&b%i==0){
           if(max<i)
           {
               max=i;
           }
       }
   }return max;
}
int findGCD(int* nums, int numsSize){
int max=0;                                    //找出最大和最小
int min=nums[0];
for(int i=0;i<numsSize;i++)
{
    if(max<nums[i])
      max=nums[i];
    if(min>nums[i])
      min=nums[i];
}return gcd(max,min);
}

2.暴力枚举+限界优化

枚举[1,min(a,b)],再找出(a%i==0)&&(b%i==0) 中的i的最大时间复杂度为 O(min(a,b))。

int gcd(int a,int b)
{
    int min=a;
    if(min>b)min=b;                    //找a,b的最小值
    int max=0;
   for(int i=1;i<=min;i++)
   {
       if(a%i==0&&b%i==0){
           if(max<i)
           {
               max=i;
           }
       }
   }return max;
}
int findGCD(int* nums, int numsSize){
int max=0;
int min=nums[0];
for(int i=0;i<numsSize;i++)
{
    if(max<nums[i])
      max=nums[i];
    if(min>nums[i])
      min=nums[i];
}return gcd(max,min);
}

3.公式 

gcd(a,b)当b等于0时,gcd(a,b)=a

                  当b不等于0,gcd(a,b)=gcd(b,a mod b);

int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);            //当b=0时为a,否则为gcd(b,a%b)
}
int findGCD(int* nums, int numsSize){
int max=0;
int min=nums[0];
for(int i=0;i<numsSize;i++)
{
    if(max<nums[i])
      max=nums[i];
    if(min>nums[i])
      min=nums[i];
}return gcd(max,min);
}