题目链接:2521.数组乘积中的不同质因数数目
题目描述
给你一个正整数数组nums
,对nums
所有元素求积之后,找出并返回乘积中不同质因数
的数目。
注意如下:
质数
是指大于1
且仅能被1
及自身整除的数字。- 如果
val2 / val1
是一个整数,则整数val1
是另一个整数val2
的一个因数。
示例 1
输入:nums = [2,4,3,7,10,6]
输出:4
解释:
nums 中所有元素的乘积是:2 * 4 * 3 * 7 * 10 * 6 = 10080 = 25 * 32 * 5 * 7 。
共有 4 个不同的质因数,所以返回 4 。
示例 2
输入:nums = [2,4,8,16]
输出:1
解释:
nums 中所有元素的乘积是:2 * 4 * 8 * 16 = 1024 = 210 。
共有 1 个不同的质因数,所以返回 1 。
提示
- 1 <= nums.length <= 104
- 2 <= nums[i] <= 1000
解法一:分解因数
本题核心其实是将一个数的所以质因数找出来并且记录,因为只需要不同质因数的数目,所以我们的记录是不重复的,而且长度未知,我们可以使用set去记录数据。
public int distinctPrimeFactors(int[] nums) {
HashSet<Integer> set = new HashSet<>();
for (int i : nums) {
if (isPrime(i)) {
set.add(i);
} else {
for (int j = 2; j <= i; j++) {
if (i % j == 0) {
if (isPrime(j)) {
set.add(j);
}
i /= j;
j--;
}
}
}
}
return set.size();
}
public boolean isPrime(int num) {
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
解法二:分解因数进阶
除1外,一个数不是质数就是合数,如果一个数是合数,那么它一定有因数,且它的因数除1外都是质数
public int distinctPrimeFactors2(int[] nums) {
HashSet<Integer> set = new HashSet<>();
for (int i : nums) {
for (int j = 2; j * j <= i; j++) {
if (i % j == 0) {//符合判断条件的j一定是质数,因为j一旦是合数一定也有质因数
set.add(j);
while (i % j == 0) {
i /= j;
}
}
}
if (i > 1) {//保证本身就是质数的元素可以记录
set.add(i);
}
}
return set.size();
}