1. 程式人生 > 實用技巧 >【雜湊表】B000_LC_數的平方等於兩數乘積的方法數(map預處理)

【雜湊表】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)\)