LeetCode第2521题-数组乘积中的不同质因数数目-java实现-图解思路与手撕代码
一、题目描述
给你一个正整数数组 nums ,对 nums 所有元素求积之后,找出并返回乘积中 不同质因数 的数目。
注意:
质数 是指大于 1 且仅能被 1 及自身整除的数字。
如果 val2 / val1 是一个整数,则整数 val1 是另一个整数 val2 的一个因数。
二、解题思路与代码实现
1.解题思路
找出每一个数的质因数,存进哈希表中,最后返回哈希表的长度。
对于一个数num,如何求它的质因数呢?
从 [2,(Math.sqrt(num) + 1)] 取值,对于每一个值,用num除以它,直至余数不为0,保存这个数和除以的次数,更新num。如果取得值大于num,就直接跳出循环,即剩下的值不用继续取了。最终如果num的值不为1,或者保存数及其次数的res为空,就保存num和1(作为num的次数)。
2.代码实现
代码如下(示例):
public static int distinctPrimeFactors(int[] nums) {
HashSet res = new HashSet();
for (int num : nums) {
res.addAll(getPrimeFactor(num).keySet());
}
return res.size();
}
private static HashMap<Integer, Integer> getPrimeFactor(int num) {
HashMap<Integer, Integer> res = new HashMap<>();
for (int i = 2; i < (Math.sqrt(num) + 2); i++) {
int cnt = 0;
while (num % i == 0) {
num /= i;
cnt++;
}
if (cnt != 0) {
res.put(i, cnt);
}
if (i > num) {
break;
}
}
if (num != 1 || res.isEmpty()) {
res.put(num, 1);
}
return res;
}
总结
这道题主要难点在于求一个数的质因数,固定的模板也可以直接用于其他相似题目。