(LeetCode) 3162. 优质数对的总数 I(哈希表+因数)

题目:3162. 优质数对的总数 I

在这里插入图片描述
思路:因数+哈希表。

C++版本:

class Solution {
public:
    long long numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) {
    	//存储每个因数对应多少个数组nums1中的元素
        unordered_map<int,int> mp;
        //寻找因数
        for(auto x:nums1){
        	//不能整除
            if(x%k) continue;
            x/=k;
            //寻找所有可能的因数
            for(int i=1;i<=x/i;i++){
                if(x%i) continue;
                mp[i]++;
                if(i!=x/i) mp[x/i]++;
            }
        }
        //答案
        long long ans=0;
        //看看nums2中的元素是否可以成为nums1中的因数
        for(auto x:nums2){
            ans+=mp[x];
        }
        return ans;
    }
};

JAVA版本:

class Solution {
    public int numberOfPairs(int[] nums1, int[] nums2, int k) {
    	//存储每个因数对应多少个数组nums1中的元素
        Map<Integer,Integer> mp =new HashMap<Integer,Integer>();
        //寻找因数
        for(var x:nums1){
        	//不能整除
            if(x%k!=0) continue;
            x/=k;
            //寻找所有可能的因数
            for(int i=1;i<=x/i;i++){
                if(x%i!=0) continue;
                //mp.merge(i,1,Integer::sum);
                mp.put(i,mp.getOrDefault(i,0)+1);
                if(i!=x/i) mp.merge(x/i,1,Integer::sum);
            }
        }
        //答案
        int ans=0;
        //看看nums2中的元素是否可以成为nums1中的因数
        for(var x:nums2){
            if(mp.containsKey(x))ans+=mp.get(x);
        }
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值