मान लीजिए हमारे पास दो सरणियाँ nums1 और nums2 हैं, हमें ट्रिपलेट्स (प्रकार 1 और प्रकार 2) खोजने हैं जो इन दो नियमों का पालन करते हैं:
- ट्रिपलेट (i, j, k) यदि nums1[i]² = nums2[j] * nums2[k] जहाँ [0 ≤ i < nums1 का आकार और 0 ≤ j < k < nums2 का आकार]
- ट्रिपलेट (i, j, k) यदि nums2[i]² = nums1[j] * nums1[k] जहाँ [0 ≤ i < nums2 का आकार और 0 ≤ j < k < nums1 का आकार]
उदाहरण के लिए, यदि इनपुट है nums1 = [7,4] और nums2 = [5,2,8,9], तो आउटपुट 1 होगा क्योंकि प्रकार 1 का एक ट्रिपलेट (1,1,2) है: nums1[1]² = nums2[1] * nums2[2] = (16 = 2*8)।
समाधान दृष्टिकोण
इस समस्या को हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे:
- cnt1 := nums1 के प्रत्येक तत्व और उसकी गिनती को रखने के लिए एक मैप
- cnt2 := nums2 के प्रत्येक तत्व और उसकी गिनती को रखने के लिए एक मैप
- एक फ़ंक्शन triplets() परिभाषित करें जो arr1, arr2 लेता है
- ans := 0
- arr1 के प्रत्येक (t, v) जोड़े के लिए:
- k := arr2[t] यदि मौजूद है, अन्यथा 0
- tmp := k*(k-1)/2
- sq := t * t
- arr2 के प्रत्येक m के लिए:
- यदि m < t और sq % m == 0, तो
- tmp := tmp + arr2[m] * arr2[sq//m] (यदि मौजूद हैं)
- यदि m < t और sq % m == 0, तो
- ans := ans + tmp * v
- ans लौटाएं
- मुख्य विधि से: triplets(cnt1, cnt2) + triplets(cnt2, cnt1) लौटाएं
उदाहरण
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:
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