力扣每日一题 6/20 数学+数组
- 博客主页:誓则盟约
- 系列专栏:IT竞赛 专栏
- 关注博主,后期持续更新系列文章
- 如果有错误感谢请大家批评指出,及时修改
- 感谢大家点赞👍收藏⭐评论✍
2748.美丽下标对的数目【简单】
题目:
给你一个下标从 0 开始的整数数组 nums 。如果下标对 i、j 满足 0 ≤ i
返回 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 和 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 0:
num //= 10
for gcd_num in factor[num]:
count += last[gcd_num]
return count
通过对比两者的提交耗时,可以直观的发现优化后的复杂度有大大降低。
总结:
优化后代码详解:
- factor 字典:定义了每个数字的因数列表。例如,数字 1 的因数是 1、2、3、4、5、6、7、8、9,数字 2 的因数是 1、3、5、7、9,以此类推。
- last 列表:用于记录每个数字在列表中出现的次数。初始时,每个数字的出现次数都为 0。
- 遍历列表 nums:对于每个数字 num,将其在 last 列表中的出现次数加 1。
- 再次遍历列表 nums:对于每个数字 num,将其在 last 列表中的出现次数减 1。然后,通过不断除以 10,将数字 num 的首位数字提取出来。
- 对于提取出来的首位数字,遍历其因数列表 factor[num]。对于每个因数 gcd_num,将其在 last 列表中的出现次数加到 count 变量中。
- 最后,返回 count 变量,即美丽数对的数量。
主要考察了以下几个方面:
- 对字典和列表的使用:通过 factor 字典存储数字的因数列表,通过 last 列表记录数字的出现次数。
- 循环和条件判断:使用两个嵌套的循环遍历列表 nums,并根据条件进行计算。
- 数学运算:涉及到除法和取余运算,用于提取数字的首位数字。
- 问题解决能力:通过分析问题,设计合适的数据结构和算法来解决美丽数对的计算问题。
刷过这道题可以学到以下几点:
- 如何使用字典和列表来存储和操作数据。
- 如何使用循环和条件判断来解决问题。
- 如何进行数学运算和处理数字。
- 如何分析问题并设计有效的算法。
- 对代码的优化和改进,例如减少重复计算和提高代码的可读性。
“别人总是以为你什么都有,但你只剩自己了。”——意难藏——
- 2 0:
num //= 10
for gcd_num in factor[num]:
count += last[gcd_num]
return count
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。