题目描述
题目分析
看到题目以后第一个想法是遍历数组,对每个元素有一个数据结构中保存了该元素出现的次数,然后往结果中相加(表示该元素和前面的对数),然后再将元素出现的次数加一。
思考用什么数据结构保存元素出现次数的时候想到用线性哈希,看到数据最大不超过10,那么就用
10
∗
x
+
y
10*x+y
10∗x+y即可。这样很容易获得所有牌出现的次数。
这个时候我懒得每次往结果中加元素了。如果很容易获得牌出现的次数n
,想要得到有多少对,即就是
C
n
2
C_{n}^{2}
Cn2。
看了题解以后,我觉得应该我这样的做法复杂度稍微优秀一点点,因为往结果中加入是
O
(
n
)
O(n)
O(n)的复杂度,但是将所有牌遍历一遍是
O
(
1
)
O(1)
O(1)的复杂度
AC代码
class Solution {
public:
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
int ret = 0;
constexpr int MAXN = 10;
vector<int> mp(MAXN * MAXN, 0);
for (auto &item : dominoes) {
int hash;
if (item[0] >= item[1]) {
hash = item[0] * MAXN + item[1];
} else {
hash = item[1] * MAXN + item[0];
}
++mp[hash];
}
for (auto &n : mp) {
if (n > 1) {
ret += n * (n-1) / 2;
}
}
return ret;
}
};
官方代码
class Solution {
public:
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
vector<int> num(100);
int ret = 0;
for (auto& it : dominoes) {
int val = it[0] < it[1] ? it[0] * 10 + it[1] : it[1] * 10 + it[0];
ret += num[val];
num[val]++;
}
return ret;
}
};
//作者:LeetCode-Solution
//链接:https://leetcode-cn.com/problems/number-of-equivalent-domino-pairs/solution/deng-jie-duo-mi-nuo-gu-pai-dui-de-shu-li-yjlz/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题解写法的优秀的地方在于用了一个三元表达式,显得代码比较简洁。