题目描述
题目分析
看到题目以后第一个想法是遍历数组,对每个元素有一个数据结构中保存了该元素出现的次数,然后往结果中相加(表示该元素和前面的对数),然后再将元素出现的次数加一。
思考用什么数据结构保存元素出现次数的时候想到用线性哈希,看到数据最大不超过10,那么就用10∗x+y10*x+y10∗x+y即可。这样很容易获得所有牌出现的次数。
这个时候我懒得每次往结果中加元素了。如果很容易获得牌出现的次数n
,想要得到有多少对,即就是Cn2C_{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)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题解写法的优秀的地方在于用了一个三元表达式,显得代码比较简洁。