首页 > 其他分享 >(nice!!!)LeetCode 3164. 优质数对的总数 II(数组、哈希表)

(nice!!!)LeetCode 3164. 优质数对的总数 II(数组、哈希表)

时间:2024-07-02 15:55:53浏览次数:25  
标签:sta int 数对 long II 哈希 ans nums1 nums2

3164. 优质数对的总数 II

在这里插入图片描述
在这里插入图片描述

思路:先找出可以被k整除的nums[i].
方法一:统计因子。
1、找出数组nums1每个元素的因子,用哈希表来记录每个因子出现的次数。然后再遍历数组nums2进行累加即可。

class Solution {
public:
    const int N=1e6+10;
    long long numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) {
    	//记录数组nums1每个元素的所有因子出现的次数
        vector<int> sta(N,0);
        for(int i=0;i<nums1.size();i++){
            if(nums1[i]%k) continue;
            int tmp=nums1[i]/k;
            for(int j=1;j<=tmp/j;j++){
                if(tmp%j==0){
                    sta[j]++;
                    if(tmp/j!=j) sta[tmp/j]++;  
                }
            }
        }
        //遍历数组nums2进行累加
        long long ans=0;
        for(int i=0;i<nums2.size();i++){
            ans+=sta[nums2[i]];
        }
        return ans;
    }
};

方法二:倍增枚举。
1、先用数组sta记录可以被k整除的nums[i]。
2、再用哈希表map来统计nums2的元素。这里是避免大量重复的元素造成的时间浪费。
3、遍历哈希表map里的元素,来进行倍增。累计数组sta出现的次数即可

class Solution {
public:
    const int N=1e6+10;
    long long numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) {
    	//记录可以被k整除的nums[i]
        vector<int> sta(N,0);
        //记录最大的nums1[i]/k,倍增时不超过这个数即可
        int mx=0;
        for(int i=0;i<nums1.size();i++){
            if(nums1[i]%k) continue;
            sta[nums1[i]/k]++;
            mx=max(mx,nums1[i]/k);
        }
        //统计nums2的元素,避免大量重复的元素造成的时间浪费。
        unordered_map<int,int> mp;
        for(auto t:nums2){
            mp[t]++;
        }
        long long ans=0;
        //遍历哈希表map里的元素,进行倍增。
        for(auto t:mp){
            for(int j=1;j*t.first<=mx;j++){
            	//累计数组sta出现的次数即可
                ans+=(long long)sta[j*t.first]*t.second;
            }
        }
        return ans;
    }
};

标签:sta,int,数对,long,II,哈希,ans,nums1,nums2
From: https://blog.csdn.net/weixin_46028214/article/details/140128077

相关文章

  • 9.优化算法之哈希表
    classSolution{publicList<List<String>>groupAnagrams(String[]strs){Map<String,List<String>>map=newHashMap<>();for(Stringstr:strs){char[]array=str.toCharArray();Arrays.......
  • 代码随想录算法训练营第四十三天 | 52.携带研究材料 518.零钱总和II 377.组合总和IV 7
    完全背包有N件物品和一个最多能被重量为W的背包,第i间物品的重量为weights[i],价值为value[i],每件物品都有无限个,求解将哪些物品装入背包里,物品价值总和最大遍历顺序:纯完全背包问题(即求装满背包后的最大价值)先遍历背包先遍历物品都是可以的和零一背包求解的最大不同就是遍历顺序......
  • 修复《Call of Duty: Black Ops III(使命召唤3)》DLL损坏问题:确保游戏体验顺畅的详尽方
    《CallofDuty:BlackOpsIII》(使命召唤:黑色行动3)是一款由Treyarch开发、动视发行的未来战争题材第一人称射击游戏,设定在2065年的近未来,玩家扮演高科技装备的超级士兵,参与紧张激烈的单人战役与多人对战,还包括标志性的丧尸模式。如果你遇到《CallofDuty:BlackOpsIII》......
  • 代码随想录算法训练营第四十二天 | 1049最后一块石头的重量II 494.目标和 474.一和零
    1049.最后一块石头的重量题目链接文章讲解视频讲解解题思路:  将石头尽量分为相等的两堆,两堆最差即为所求结果  石头的重量就是石头的价值动规五部曲:dp[j]:表示背包容量为j时可以装的石头的总价值递推公式:dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]初始化:均......
  • Day6 四数之和II,赎金信,三数之和,四数之和
    四数之和II 在这道题中我们要做的是寻找次数,所以在这个代码中这个次数就是value因为我们是通过key来寻找value。所以为了寻找这个次数我们需要把这个我们要找的数当做值,由此我们需要根据键来寻找值!!!#include<iostream>#include<unordered_map>usingnamespacestd;#inc......
  • Day7 反转字符串,反转字符串II,替换数字
    反转字符串 #include<iostream>usingnamespacestd;#include<string>voidfanzhuan(string&s){ for(inti=0,j=s.size()-1;i<s.size()/2;i++,j--) { swap(s[i],s[j]); } cout<<s;}intmain(){ strings; cin>>s; ......
  • 【Java完整版 面试必备】Leetcode Top100题目和答案-哈希
    以下摘自leetcodeTop100精选题目-哈希1.两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。......
  • 力扣第213题“打家劫舍 II”
    在本篇文章中,我们将详细解读力扣第213题“打家劫舍II”。通过学习本篇文章,读者将掌握如何使用动态规划来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。问题描述力扣第213题“打家劫舍II”描述如下:你是一个专业的小偷,计......
  • leetCode.92. 反转链表 II
    leetCode.92.反转链表II题目思路代码/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNod......
  • 基于ucosii的车载电控单元
    一、项目简介   通过利用STM32F103C8、直流电机、按键、us015超声波测距模块、MPU6050、蜂鸣器、TFLCD、霍尔传感器等硬件设计一个车载电控单元,实现了手动加档、实时显示车速、超声波避障预警、车身倾斜预警以及更新固件功能,以保证行车安全。二、项目框架   三、......