zoukankan      html  css  js  c++  java
  • 【哈希表】B000_LC_数的平方等于两数乘积的方法数(map预处理)

    给你两个整数数组 nums1 和 nums2 ,请你返回根据以下规则形成的三元组的数目(类型 1 和类型 2 ):
    类型 1:三元组 (i, j, k) ,如果 nums1[i]2 == nums2[j] * nums2[k] 其中 0 <= i < nums1.length 且 0 <= j < k < nums2.length
    类型 2:三元组 (i, j, k) ,如果 nums2[i]2 == nums1[j] * nums1[k] 其中 0 <= i < nums2.length 且 0 <= j < k < nums1.length

    输入:nums1 = [7,4], nums2 = [5,2,8,9]
    输出:1
    解释:类型 1:(1,1,2), nums1[1]^2 = nums2[1] * nums2[2] (4^2 = 2 * 8)
    

    方法一:map预处理

    不要嵌套循环遍历 map,那样会妥妥的O(n),用map内部的O(logn)查找去查找目标值更快

    typedef long long ll;
    class Solution {
    public:
        int numTriplets(vector<int>& A, vector<int>& B) {
            ll n=A.size(), m=B.size(), ans=0;
            unordered_map<ll, ll> m1, m2;
            
            for (int i=0; i<n-1; i++)
            for (int j=i+1; j<n; j++) 
                m1[(ll) A[i]*A[j]]++;
            for (int i=0; i<m-1; i++)
            for (int j=i+1; j<m; j++) 
                m2[(ll) B[i]*B[j]]++;
            
            for (int i=0; i<n; i++) {
                ll t=(ll)A[i]*A[i];
                if (m2.find(t)!=m2.end()) ans+=m2[t];
            }
            for (int i=0; i<m; i++) {
                ll t=(ll)B[i]*B[i];
                if (m1.find(t)!=m1.end()) ans+=m1[t];
            }
            return ans;
        }
    };
    

    复杂度分析

    • Time\(O(n^2)\)
    • Space\(O(n)\)
  • 相关阅读:
    知识要点
    SQL语法(包括建库、建表、建视图、查询、增加、删除、修改)
    SQL语句(建库、建表、修改语句)
    比较好的电影网站
    crud创建,修改,删除,查询
    代码创建与操作数据库
    数据库
    数组与集合
    结构体
    类的运用
  • 原文地址:https://www.cnblogs.com/wdt1/p/13622442.html
Copyright © 2011-2022 走看看