2748. 美丽下标对的数目

题目描述:

给你一个下标从 0 开始的整数数组 nums 。如果下标对 ij 满足 0 ≤ i < j < nums.length ,如果 nums[i]第一个数字nums[j]最后一个数字 互质 ,则认为 nums[i]nums[j] 是一组 美丽下标对

返回 nums美丽下标对 的总数目。

对于两个整数 xy ,如果不存在大于 1 的整数可以整除它们,则认为 xy 互质 。换而言之,如果 gcd(x, y) == 1 ,则认为 xy 互质,其中 gcd(x, y)xy 的 最大公因数

示例 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 和 5 互质,因此 gcd(2,1) == 1 。
i = 1 和 j = 2 :nums[1] 的第一个数字是 5 ,nums[2] 的最后一个数字是 1 。2 和 5 互质,因此 gcd(5,1) == 1 。
i = 1 和 j = 3 :nums[1] 的第一个数字是 5 ,nums[3] 的最后一个数字是 4 。2 和 5 互质,因此 gcd(5,4) == 1 。
i = 2 和 j = 3 :nums[2] 的第一个数字是 1 ,nums[3] 的最后一个数字是 4 。2 和 5 互质,因此 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

解题分析及思路:

方法:哈希表

思路:

本题可以采用暴力直接求解,依次比较每个元素。

先计算nums[i]第一个数字nums[j]最后一个数字,然后判断是否互质即可。

// nums[i] 的 第一个数字
var tempI = nums[i]
for tempI >= 10 {
    tempI = tempI / 10
}

// nums[j] 的 第一个数字
tempJ := nums[j] % 10

可以用gcd方法判断是否互质:

func gcd(a, b int) bool {
	for b != 0 {
		a, b = b, a%b
	}
	return a == 1
}

当然,个位数的质数也有限,可以直接用哈希表保存来判断

var m = map[int]map[int]bool{
	1: {
		1: true,
		2: true,
		3: true,
		4: true,
		5: true,
		6: true,
		7: true,
		8: true,
		9: true,
	},
	2: {
		1: true,
		3: true,
		5: true,
		7: true,
		9: true,
	},
	3: {
		1: true,
		2: true,
		4: true,
		5: true,
		7: true,
		8: true,
	},
	4: {
		1: true,
		3: true,
		5: true,
		7: true,
		9: true,
	},
	5: {
		1: true,
		2: true,
		3: true,
		4: true,
		6: true,
		7: true,
		8: true,
		9: true,
	},
	6: {
		1: true,
		5: true,
		7: true,
	},
	7: {
		1: true,
		2: true,
		3: true,
		4: true,
		5: true,
		6: true,
		8: true,
		9: true,
	},
	8: {
		1: true,
		3: true,
		5: true,
		7: true,
		9: true,
	},
	9: {
		1: true,
		2: true,
		4: true,
		5: true,
		7: true,
		8: true,
	},
}

func countBeautifulPairs(nums []int) (result int) {
	for i := 0; i < len(nums); i++ {
		var tempI = nums[i]
		for tempI >= 10 {
			tempI = tempI / 10
		}
		for j := i + 1; j < len(nums); j++ {
			tempJ := nums[j] % 10
			if _, ok := m[tempI][tempJ]; ok {
				result++
			}
		}
	}
	return
}

复杂度:

  • 时间复杂度:O(N2)
  • 空间复杂度:O(1)

执行结果:

  • 执行耗时:30 ms,击败了8.70% 的Go用户
  • 内存消耗:4.2 MB,击败了100.00% 的Go用户

通过次数 25.5K 提交次数 39.2K 通过率 65.0%

Related Posts

100. 相同的树

## 题目描述:给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1: 输入:p = [1,2,3], q = [1,2,3] 输出:true示例 2: ![](/img/leetco

read more

101. 对称二叉树

## 题目描述:给你一个二叉树的根节点 root , 检查它是否轴对称。示例 1: 输入:root = [1,2,2,3,4,4,3] 输出:true示例 2: ![](/img/leetcode/101对称二叉树/1698027008-nP

read more

104. 二叉树的最大深度

## 题目描述: 给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。**测试用例:**示例1: 输入:root = [3,9,20,null,null,15,7] 输出:3 3 / \ 9 20 / \ 15 7 示例2: ``` 输入:roo

read more

1089. 复写零

## 题目描述:给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。示例 1:``` 输入:arr = [1,0,2,3,0,4,5,0] 输出:[1,0,0,2,3,0,0,4] 解释:调用函数后,输入的数组

read more

108. 将有序数组转换为二叉搜索树

## 题目描述:给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。示例 1: ``` 输入:nums = [-10,-3,0,5,9] 输出:

read more

1189. “气球” 的最大数量

## 题目描述:给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"示例 1:****

read more