題目:
給你一個(gè)由一些多米諾骨牌組成的列表 dominoes应闯。
如果其中某一張多米諾骨牌可以通過旋轉(zhuǎn) 0 度或 180 度得到另一張多米諾骨牌漩勤,我們就認(rèn)為這兩張牌是等價(jià)的焕妙。
形式上盯腌,dominoes[i] = [a, b] 和 dominoes[j] = [c, d] 等價(jià)的前提是 a==c 且 b==d践剂,或是 a==d 且 b==c鬼譬。
在 0 <= i < j < dominoes.length 的前提下,找出滿足 dominoes[i] 和 dominoes[j] 等價(jià)的骨牌對(duì) (i, j) 的數(shù)量逊脯。
示例:
輸入:dominoes = [[1,2],[2,1],[3,4],[5,6]]
輸出:1
解題方法:
這道題一開始想到使用set來處理优质,但是沒有想到用map+set來做,數(shù)據(jù)結(jié)構(gòu)用的不夠熟練军洼,所以特意記錄一下巩螃。程序的思路就是:
創(chuàng)建一個(gè)set,把多米諾骨牌的兩個(gè)數(shù)存進(jìn)去匕争;
通過map記錄這個(gè)set出現(xiàn)的次數(shù)避乏;
遍歷map,統(tǒng)計(jì)總共出現(xiàn)的等價(jià)骨牌對(duì)數(shù)甘桑,這里因?yàn)椴皇桥帕惺墙M合拍皮,所以應(yīng)該加Cn^2。
代碼和結(jié)果:
class Solution {
public:
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
map<set<int>,int> map1;
int count=0;
for(int i=0;i<dominoes.size();i++)
{
set<int> set1;
set1.insert(dominoes[i][0]);
set1.insert(dominoes[i][1]);
map1[set1]++;
}
map<set<int>,int>::iterator it;
for(it = map1.begin();it != map1.end();it++)
{
if(it->second >1) count += (it->second)*(it->second - 1)/2;
}
return count;
}
};
運(yùn)行結(jié)果:在內(nèi)存占用和速度方面跑杭,這個(gè)方法并不好铆帽,但是這種解法讓我對(duì)map和set使用有了更深的認(rèn)識(shí),而且代碼實(shí)現(xiàn)非常簡(jiǎn)潔德谅,在性能要求不苛刻的條件下锄贼,我覺得是一個(gè)比較容易學(xué)會(huì)和使用的方法,值得一記女阀。
原題鏈接:https://leetcode-cn.com/problems/number-of-equivalent-domino-pairs/