每日一题:leetcode1128.等价多米诺骨牌对数

题目描述

在这里插入图片描述

题目分析

看到题目以后第一个想法是遍历数组,对每个元素有一个数据结构中保存了该元素出现的次数,然后往结果中相加(表示该元素和前面的对数),然后再将元素出现的次数加一。
思考用什么数据结构保存元素出现次数的时候想到用线性哈希,看到数据最大不超过10,那么就用 10 ∗ x + y 10*x+y 10x+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)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题解写法的优秀的地方在于用了一个三元表达式,显得代码比较简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值