跳转至

1128. 等价多米诺骨牌对的数量

这是六则或许对你有些许帮助的信息:

⭐️1、阿秀与朋友合作开发了一个编程资源网站,目前已经收录了很多不错的学习资源和黑科技(附带下载地址),如过你想要寻求合适的编程资源,欢迎体验以及推荐自己认为不错的资源,众人拾柴火焰高,我为人人,人人为我🔥!

2、👉23年5月份阿秀从字节跳动离职跳槽到某外企期间,为方便自己找工作,增加上岸几率,我自己从0开发了一个互联网中大厂面试真题解析网站,包括两个前端和一个后端。能够定向查看某些公司的某些岗位面试真题,比如我想查一下行业为互联网,公司为字节跳动,考察岗位为后端,考察时间为最近一年之类的面试题有哪些?

网站地址:InterviewGuide大厂面试真题解析网站。点此可以查看该网站的视频介绍:B站视频讲解 如果可以的话求个B站三连,感谢!

3、😊 分享一个阿秀自己私藏的黑科技网站点此直达,主要是各类小众实用APP、网站等,除此外也包括高清影视、音乐、电视剧、AI、纪录片、英语四六级考试、考研考公、副业等资源。

4、😍免费分享阿秀个人学习计算机以来收集到的免费学习资源,点此白嫖;也记录一下自己以前买过的不错的计算机书籍、网络专栏和垃圾付费专栏;也记录一下自己以前买过的不错的计算机书籍、网络专栏和垃圾付费专栏

5、🚀如果你想在校招中顺利拿到更好的offer,阿秀建议你多看看前人踩过的坑留下的经验,事实上你现在遇到的大多数问题你的学长学姐师兄师姐基本都已经遇到过了。

6、🔥 欢迎准备计算机校招的小伙伴加入我的学习圈子,一个人踽踽独行不如一群人报团取暖,圈子里沉淀了很多过去21/22/23/24/25届学长学姐的经验和总结,好好跟着走下去的,最后基本都可以拿到不错的offer!如果你需要《阿秀的学习笔记》网站中📚︎校招八股文相关知识点的PDF版本的话,可以点此下载

1128. 等价多米诺骨牌对的数量 好题,真的很好的题

力扣原题链接(点我直达)

给你一个由一些多米诺骨牌组成的列表 dominoes

如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的。

形式上,dominoes[i] = [a, b]dominoes[j] = [c, d] 等价的前提是 a==cb==d,或是 a==db==c

0 <= i < j < dominoes.length 的前提下,找出满足 dominoes[i]dominoes[j] 等价的骨牌对 (i, j) 的数量。

示例:

Text Only
输入:dominoes = [[1,2],[2,1],[3,4],[5,6]]
输出:1

提示:

  • 1 <= dominoes.length <= 40000
  • 1 <= dominoes[i][j] <= 9

第一版,直接遍历,超出时间限制

C++
    int numEquivDominoPairs(vector<vector<int>>& dominoes) {
    int cut = 0;
    for (int i = 0; i < dominoes.size(); ++i) {
        for (int j = i + 1; j < dominoes.size(); ++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]))
                cut++;
        }
    }

    return cut;

    }

第二版,自己定义unordered_map的键值,为其他类型

执行用时 :52 ms, 在所有 cpp 提交中击败了87.56%的用户

内存消耗 :21 MB, 在所有 cpp 提交中击败了100.00%的用户

实例:https://blog.csdn.net/zhangpiu/article/details/49837387?utm_source=blogxgwz9

C++
struct KEY
{
    int minNum;
    int maxNum;

    KEY(int f, int s) : minNum(f), maxNum(s) {}
};

struct HashFunc
{
    std::size_t operator()(const KEY& key) const
    {
        using std::size_t;
        using std::hash;

        return ((hash<int>()(key.minNum)
            ^ (hash<int>()(key.maxNum) << 1)) >> 1);
    }
};

struct EqualKey
{
    bool operator () (const KEY& lhs, const KEY& rhs) const
    {
        return lhs.minNum == rhs.minNum
            && lhs.maxNum == rhs.maxNum;
    }
};

int numEquivDominoPairs(vector<vector<int>>& dominoes) {

    unordered_map<KEY,int,HashFunc,EqualKey> unmp;

    int cut = 0;
    int maxNum=0, minNum=0;
    for (auto &n:dominoes) {
        minNum = min(n[0], n[1]);
        maxNum = max(n[0], n[1]);

        if (unmp.find({ minNum,maxNum }) != unmp.end()) {
            cut += unmp[{ minNum, maxNum }];
            unmp[{minNum, maxNum}]++;
        }
        else
            unmp[{minNum,maxNum}]++;
    }

    return cut;
}

第三版,参考别人的,会更快一点了

执行用时 :48 ms, 在所有 cpp 提交中击败了95.27%的用户

内存消耗 :21.1 MB, 在所有 cpp 提交中击败了100.00%的用户

C++
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
    unordered_map<int, int> ret;
    int cut = 0,minNum=0,maxNum=0;

    for (auto& a : dominoes) {
        maxNum = max(a[0], a[1]);
        minNum = min(a[0], a[1]);
        if (ret.find(minNum * 10 + maxNum) != ret.end()) {
            cut += ret[minNum * 10 + maxNum];
        }
        ret[minNum * 10 + maxNum] += 1;

    }

    return cut;
}

第四版,别人的写法,化为数学公式来做的

执行用时 :44 ms, 在所有 cpp 提交中击败了97.76%的用户

内存消耗 :21.1 MB, 在所有 cpp 提交中击败了100.00%的用户

C++
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
        map<int, int> ret;
        int count = 0;

        for(int i  = 0; i < dominoes.size(); ++i)
        {
            int k = 0;
            int m = dominoes[i][0];
            int n = dominoes[i][1];
            (m > n) ? k = n * 10 + m : k = m * 10 + n;//这种表达式也是可以的
            ret[k] += 1;
        }

        for(auto iter = ret.begin(); iter != ret.end(); ++iter)
        {
            count += iter->second * (iter->second - 1) / 2;
        }

        return count;
    }

第五版,结合一下,最快的

执行用时 :40 ms, 在所有 cpp 提交中击败了99.00%的用户

内存消耗 :21 MB, 在所有 cpp 提交中击败了100.00%的用户

C++
int numEquivDominoPairs(vector<vector<int>>& dominoes) {

    unordered_map<int, int> ret;
    int k = 0, m = 0, n = 0;
    for (int i = 0; i < dominoes.size(); ++i)
    {
        m = dominoes[i][0];
        n = dominoes[i][1];
        (m > n) ? k = n * 10 + m : k = m * 10 + n;//这种表达式也是可以的
        ret[k] += 1;
    }
    int count = 0;
    for (auto &iter:ret)
    {
        count += iter.second * (iter.second - 1) / 2;
    }

    return count;
}