前言
经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。
数论包含最大公约数(>=2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。
描述
给你一个下标从 0 开始的整数数组
nums
。如果下标对i
、j
满足0 ≤ i < j < nums.length
,如果nums[i]
的 第一个数字 和nums[j]
的 最后一个数字 互质 ,则认为nums[i]
和nums[j]
是一组 美丽下标对 。返回
nums
中 美丽下标对 的总数目。对于两个整数
x
和y
,如果不存在大于 1 的整数可以整除它们,则认为x
和y
互质 。换而言之,如果gcd(x, y) == 1
,则认为x
和y
互质,其中gcd(x, y)
是x
和y
的 最大公因数 。示例 1:
输入:nums = [2,5,1,4] 输出:5 解释:nums 中共有 5 组美丽下标对: i = 0 和 j = 1 :nums[0] 的第一个数字是 2 ,nums[1] 的最后一个数字是 5 。2 和 5 互质,因此 gcd(2,5) == 1 。 i = 0 和 j = 2 :nums[0] 的第一个数字是 2 ,nums[2] 的最后一个数字是 1 。2 和 1 互质,因此 gcd(2,1) == 1 。 i = 1 和 j = 2 :nums[1] 的第一个数字是 5 ,nums[2] 的最后一个数字是 1 。5 和 1 互质,因此 gcd(5,1) == 1 。 i = 1 和 j = 3 :nums[1] 的第一个数字是 5 ,nums[3] 的最后一个数字是 4 。5 和 4 互质,因此 gcd(5,4) == 1 。 i = 2 和 j = 3 :nums[2] 的第一个数字是 1 ,nums[3] 的最后一个数字是 4 。1 和 4 互质,因此 gcd(1,4) == 1 。 因此,返回 5 。示例 2:
输入:nums = [11,21,12] 输出:2 解释:共有 2 组美丽下标对: i = 0 和 j = 1 :nums[0] 的第一个数字是 1 ,nums[1] 的最后一个数字是 1 。gcd(1,1) == 1 。 i = 0 和 j = 2 :nums[0] 的第一个数字是 1 ,nums[2] 的最后一个数字是 2 。gcd(1,2) == 1 。 因此,返回 2 。提示:
2 <= nums.length <= 100
1 <= nums[i] <= 9999
nums[i] % 10 != 0
实现原理与步骤
1.枚举所有符合0 ≤ i < j < nums.length的下标
2.计算i下标、j下标下对应的值
3.gcd判别是否符合美丽下标。
实现代码
class Solution {
public int countBeautifulPairs(int[] nums) {
int ans=0;
for(int i=0;i<nums.length;i++){
int num_1=nums[i];
while(num_1>=10){
num_1/=10;
}
for(int j=i+1;j<nums.length;j++){
int num_2=nums[j]%10;
if(gcd(num_1,num_2)==1){
ans++;
}
}
}
return ans;
}
public int gcd(int x,int y){
while(y!=0){
int temp=y;
y=x%y;
x=temp;
}
return x;
}
}