难度简单
给你一个由一些多米诺骨牌组成的列表 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)
的数量。
思路一:
简单的暴力比较,当前数字和前一个后续的全部数字比较 算法用例超时
改进:一旦某类数据匹配完成,与当前数据等价的后续全部数据应该不参与比较
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
int ans=0,len=dominoes.size();
int data[len];
memset(data,0,sizeof(data));
for(int i=0;i<len;++i){
if(data[i]) continue;
ans=0;
for(int j=i+1;j<len;++j){
if((dominoes[i][0]==dominoes[j][0] && dominoes[i][1]==dominoes[j][1]) ||
(dominoes[i][0]==dominoes[j][1] && dominoes[i][1]==dominoes[j][0])){
data[j]=++ans;
}
}
}
ans=0;
for(auto& index:data){
ans+=index;
}
return ans;
}
思路二:
各数据的均属于 0~9 之间,两个数字可组成 00~99 之间的全部数据,匹配的数据项应当相等或者相反
对数据预处理:根据将两个数字组成最小的两位数,可确保某各匹配项的全部数据相等
从第一个数据开始,每个数字匹配的数量依次递减 n-1~0 ,反转后匹配的数字可之间逆序处理即:0~n-1
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
int ans=0,len=dominoes.size(),temp=0;
int data[100];
memset(data,0,sizeof(data));
for(auto& index:dominoes){
temp=index[0]<index[1]? index[0]*10+index[1]: index[1]*10+index[0];
ans += data[temp]++;
}
return ans;
}