#easy
给你一个下标从 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的 最大公因数 。
提示:
2 <= nums.length <= 1001 <= nums[i] <= 9999nums[i] % 10 != 0
解决思路
辗转相除法
由于题目中需要判断两个数互质,所以使用辗转相除法判断,降低时间复杂度。
// 辗转相除法
int gcd(int x, int y) { return y == 0 ? x : gcd(y, x % y);
由于数组长度为100,因此双重循环的时间复杂度够。
int countBeautifulPairs(int* nums, int numsSize) {
//统计个数
int sum = 0;
//i严格小于nums.length
for (int i = 0; i < numsSize - 1; i++) {
int first_digit = nums[i];
//通过循环获得第一位数
while (first_digit >= 10) {
first_digit /= 10;
}
//j严格大于i
for (int j = i + 1; j < numsSize; j++) {
if (gcd(first_digit, nums[j] % 10) == 1)
sum++;
}
}
return sum;
}