สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มที่มีองค์ประกอบที่แตกต่างกัน ภารกิจคือการนับจำนวนสิ่งอันดับทั้งหมดเพื่อให้มีผลิตภัณฑ์เดียวกันทั้งหมด
หากทูเพิลคือ (a,b,c,d) มันก็จะถูกต้องถ้าทูเพิลนี้ตามมา (a*b =c*d) ตัวอย่างเช่น
อินพุต-1 :
arr[]= {2,4,6,3}
ผลผลิต :
8
คำอธิบาย:จำนวนทูเพิลทั้งหมดคือ 8 และเหล่านี้คือ (2 6 3 4),(2,6,4,3),(6,2,3,4),(6,2,4,3),( 3,4,2,6),(4,3,2,6) ,(3,4,6,2), (4,3,6,2) โดยที่ a*b =c*d.พี>
แนวทางในการแก้ปัญหานี้ -
แนวคิดในการแก้ปัญหานี้คือเราจะใช้ hashmap สำหรับการคูณทั้งหมดเป็นคู่
วิธีนี้จะช่วยให้แน่ใจว่าคู่ทั้งหมดที่จัดเก็บไว้ในแผนที่มีการคูณเหมือนกัน
หลังจากสร้างแผนที่การคูณของทุกองค์ประกอบในอาร์เรย์ที่กำหนดแล้ว เราจะสำรวจดูในแผนที่ว่ามีกี่คู่ที่มีการคูณแบบเดียวกัน (a*b =c*d)พี>
เนื่องจากจำนวนคู่ทั้งหมดสามารถนับเป็น n*(n-1)/2 และในหนึ่งคู่จะมีตัวเลข '4' ซึ่งสามารถมีได้สูงสุด 4*2 การเรียงสับเปลี่ยนดังกล่าว ดังนั้นสำหรับทุกองค์ประกอบ มันสามารถมี n*(n1)/2*8 คู่ในนั้น
-
รับอินพุตขององค์ประกอบอาร์เรย์
-
ฟังก์ชันจำนวนเต็ม countTuples(int *arr, int n) รับองค์ประกอบอาร์เรย์และขนาดเป็นอินพุต และส่งคืนจำนวน tuples ที่มีผลิตภัณฑ์เดียวกันในรูปแบบ (a*b =c*d)
-
การสร้าง hashmap เพื่อให้คีย์เป็นผลคูณของคู่และค่าเป็นความถี่ของคู่เหล่านั้น
-
วนซ้ำบนแผนที่และนับจำนวนของสิ่งอันดับดังกล่าวที่มีผลิตภัณฑ์เดียวกัน
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; int countTuple(int *arr, int n) { map<int, int> mp; for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) mp[arr[i] * arr[j]]++; int ans = 0; for (auto it : mp) ans += (it.second * (it.second - 1) / 2) * 8; return ans; } int main(){ int n=4; int arr[n]= {2,4,6,3}; int res= countTuple(arr,n); cout<<res<<" "; return 0; }
ผลลัพธ์
8
ทูเพิลทั้งหมดที่มีทูเพิลผลิตภัณฑ์เดียวกันคือ 8