问题描述:给你一个整数数组nums,返回数组中最大数和最小数的最大公约数。两个数的最大公约数是能够被两个数整数的最大正整数。
辗转相除法解决:这题让求的是数组中最大值和最小值的最大公约数。数组中的最大值和最小值很容易求,只需要一次遍历即可。这里关键的地方是求两个数字的最大公约数。求最大公约数最常见的方式就是使用欧几里得算法,也就是辗转相除法。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。实际上如果a>b,那么a和b的最大公约数就是b和a%b的最大公约数,这样一步步缩小a和b的值,直到a能被b整除,这样他们的最小公约数就是b。
public int gcd(int a,int b)
{
if(a==0||b==0){return 0;}
int bigger=a>b?a:b;
int smaller=a>b?b:a;
if(bigger%b==0){return b;}
else
{
return gcd(b,a%b);
}
}
我们来思考这样一个问题,任何矩形都可以分割成长度为1的正方形(矩形的宽和高都必须是整数)。假设我们把矩形的长和宽分别计为a和b,那么求a和b的最大公约数就是求矩形所能分割的最大正方形的边长。
递增的三元子序列:给你一个整数数组nums,判断这个数组中是否存在长度为3的递增子序列。如果存在这样的三元组下标(i,j,k)且满足i<j<k,使得nums[i]<nums[j]<nums[k],返回true,否则返回false。
求解思路:首先定义两个变量,分别记录最小值和倒数第二小值,并在找到大于倒数第二小的数字之后返回true否则返回false。
public Boolean secondLastNumber(int []nums)
{
int minNumber=Integer.MIN_VALUE;
int minTwoNumber=Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++)
{
if(nums[i]<minNumber)
{
minNumber=nums[i];
}
if(nums[i]>minTwoNumber&&minTwoNumber>minNumber)
{
minTwoNumber=nums[i];
}
if(nums[i]>minTwoNumber&&minTwoNumber>minNumber){return true;}
}
return false;
}