สมมติว่าเรามีสองอาร์เรย์ nums1 และ nums2 เราต้องหาแฝดที่ก่อตัวขึ้น (ประเภทที่ 1 และประเภทที่ 2) ตามกฎสองข้อนี้ -
- แฝดสาม (i, j, k) ถ้า nums1[i]^2 =nums2[j] * nums2[k] โดยที่ [0 <=i <ขนาดของ nums1 และ 0 <=j
- แฝดสาม (i, j, k) ถ้า nums2[i]^2 =nums1[j] * nums1[k] โดยที่ [0 <=i <ขนาดของ nums2 และ 0 <=j
- แฝดสาม (i, j, k) ถ้า nums2[i]^2 =nums1[j] * nums1[k] โดยที่ [0 <=i <ขนาดของ nums2 และ 0 <=j
ดังนั้น หากอินพุตเป็น nums1 =[7,4] nums2 =[5,2,8,9] เอาต์พุตจะเป็น 1 เนื่องจากมีแฝดสามประเภท 1, (1,1,2), nums1 [1]^2 =nums2[1] * nums2[2] =(16 =2*8)
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:
- cnt1 :=แผนที่สำหรับเก็บแต่ละองค์ประกอบและจำนวน nums1
- cnt2 :=แผนที่สำหรับเก็บแต่ละองค์ประกอบและจำนวน nums2
- กำหนดฟังก์ชัน triplets() นี่จะใช้เวลา arr1, arr2
- ตอบ :=0
- สำหรับแต่ละ t, v ใน items() ของ arr1, do
- k :=arr2[t] หากมี มิฉะนั้น 0
- tmp :=k*(k - 1) / 2
- sq :=t * t
- สำหรับแต่ละ m ใน arr2 ทำ
- ถ้า m
- tmp :=tmp + (arr2[m] หากมี มิฉะนั้น 0) * (arr2[quotient of sq/m] หากมี มิฉะนั้น 0)
- ถ้า m
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น−
from collections import Counter def solve(nums1, nums2): cnt1 = Counter(nums1) cnt2 = Counter(nums2) def triplets(arr1, arr2): ans = 0 for t, v in arr1.items(): k = arr2.get(t, 0) tmp = k * (k - 1) // 2 sq = t * t for m in arr2: if m < t and sq % m == 0: tmp += arr2.get(m, 0) * arr2.get(sq // m, 0) ans += tmp * v return ans return triplets(cnt1, cnt2) + triplets(cnt2, cnt1) nums1 = [7,4] nums2 = [5,2,8,9] print(solve(nums1, nums2))
อินพุต
[7,4],[5,2,8,9]
ผลลัพธ์
2