LeetCode第2521题-数组乘积中的不同质因数数目-java实现-图解思路与手撕代码

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;
    }

总结

这道题主要难点在于求一个数的质因数,固定的模板也可以直接用于其他相似题目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值