ให้ลิสต์โดมิโน แต่ละอันมี 2 ตัวเลข โดมิโน D[i] = [a,b] และ D[j] = [c,d] ถือว่าเทียบเท่ากันถ้า a=c และ b=d หรือ a=d และ b=c (กลับด้านได้) หาจำนวนคู่ (i,j) ที่ i<j และเทียบเท่ากัน
ตัวอย่าง: [[1,2],[2,1],[3,4],[6,5]] ผลลัพธ์ = 1 (คู่ [1,2] กับ [2,1])
ขั้นตอนการแก้ปัญหา
- สร้าง dictionary
dนับความถี่ - วนลูปแต่ละคู่ใน dominoes:
- เรียงลำดับคู่ (sort) เพื่อให้ [1,2] และ [2,1] กลายเป็น key เดียวกัน
- แปลงเป็น tuple เพื่อเป็น key ได้
- เพิ่มจำนวนใน dictionary
- สำหรับแต่ละความถี่ b ใน dictionary: เพิ่ม
b * (b-1) / 2เข้าคำตอบ (จำนวนคู่จาก b อัน) - คืนคำตอบ
ตัวอย่างโค้ด
class Solution(object):
def numEquivDominoPairs(self, dominoes):
d = {}
ans = 0
for i in dominoes:
i.sort()
i = tuple(i)
if i not in d:
d[i] = 1
else:
d[i] += 1
for b in d.values():
ans += (b * (b - 1)) // 2
return ans
ob1 = Solution()
print(ob1.numEquivDominoPairs([[1,2],[2,1],[3,4],[5,6],[4,3]]))
อินพุต
[[1,2],[2,1],[3,4],[5,6],[4,3]]
เอาต์พุต
2
วิธีแก้แบบ Pythonic (ใช้ Counter)
from collections import Counter
def numEquivDominoPairs(dominoes):
cnt = Counter(tuple(sorted(d)) for d in dominoes)
return sum(v * (v - 1) // 2 for v in cnt.values())