https://leetcode-cn.com/problems/number-of-equivalent-domino-pairs/
思路一:由于二元对的取值范围很小,不妨用
c
n
t
i
j
cnt_{ij}
cntij表示输入序列中二元对
(
i
,
j
)
(i,j)
(i,j)的数量,我们在遍历输入序列的同时,计算这个
c
n
t
cnt
cnt数组,那么当遍历到第
k
k
k个元素时,
c
n
t
cnt
cnt已经统计了
[
0
,
k
−
1
]
[0,k-1]
[0,k−1]的数据,此时对于第
k
k
k个元素,我们可以计算出与它等价的骨牌数量:
c
n
t
[
k
0
]
[
k
1
]
+
c
n
t
[
k
1
]
[
k
0
]
cnt[k_0][k_1]+cnt[k_1][k_0]
cnt[k0][k1]+cnt[k1][k0]。注意当
k
0
=
k
1
k_0=k_1
k0=k1时,我们只需要计算一次:
class Solution {
public:
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
vector<vector<int>> cnt(10,vector<int>(10));
int ans=0;
for(vector<int>&ele : dominoes)
{
ans+=cnt[ele[0]][ele[1]];
if(ele[0]!=ele[1])
ans+=cnt[ele[1]][ele[0]];
++cnt[ele[0]][ele[1]];
}
return ans;
}
};
思路二:可以只使用一维数组,且严格限定二元对的 i > = j i>=j i>=j,其它思路同上:
class Solution {
public:
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
int arr[100]={0};
int ans=0;
for(vector<int>&ele : dominoes)
{
int val=ele[0]>=ele[1]?ele[0]*10+ele[1]:ele[1]*10+ele[0];
ans+=arr[val];
++arr[val];
}
return ans;
}
};