题目描述
给你一个由一些多米诺骨牌组成的列表 dominoes。
如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的。
形式上,dominoes[i] = [a, b]
和 dominoes[j] = [c, d]
等价的前提是 a==c
且 b==d
,或是 a==d
且 b==c
。在 0 <= i < j < dominoes.length
的前提下,找出满足 dominoes[i]
和 dominoes[j]
等价的骨牌对 (i, j)
的数量。
输入:dominoes = [[1,2],[2,1],[3,4],[5,6]]
输出:1
解题思路
这种类型题目的关键是第一步要先让“相同的多米诺骨牌的状态也相同”,所以要加个“排序”的过程。
排序+哈希字典:把每个多米诺骨牌翻成小的数字在上,大的数字在下的情况(排序),这样可以使相同的多米诺骨牌的状态也相同,便于统计数目。然后用哈希字典来统计每种多米诺骨牌的个数,最后遍历每种骨牌,用组合数学 n * (n - 1) // 2
求每种骨牌成对的数目,将其累加得到最后结果。
注:这里用
unordered_map
无法通过,原因是pair<int, int>
没有对应的哈希函数,需要自己定义一个,只有一些基本数据类型才有对应的默认哈希函数。所以这里要用
map
。
参考代码
class Solution {
public:
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
int length = dominoes.size();
if(length <= 1)
return 0;
// 这里用unordered_map无法通过,原因是pair<int, int> 没有对应的哈希函数,需要自己定义
// 只有一些基本数据类型才有对应的默认哈希函数
map<pair<int, int>, int> umap;
for(int i = 0; i < length; i++){
sort(dominoes[i].begin(), dominoes[i].end());
umap[make_pair(dominoes[i][0], dominoes[i][1])]++;
}
int res = 0;
for(auto elem: umap)
res += elem.second * (elem.second - 1) / 2;
return res;
}
};
这里可能用python的字典会更好,参考题解的代码。