【雜湊表】B000_LC_數的平方等於兩數乘積的方法數(map預處理)
阿新 • • 發佈:2020-09-06
給你兩個整數陣列 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)\)