LeetCode刷题---数组---1128

等价多米诺骨牌对的数量

1128. 等价多米诺骨牌对的数量 - 力扣(LeetCode)

题目:

给你一组多米诺骨牌 dominoes 。

形式上,dominoes[i] = [a, b] 与 dominoes[j] = [c, d] 等价 当且仅当 (a == c 且 b == d) 或者 (a == d 且 b == c) 。即一张骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌。

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

示例 1:

复制代码
输入:dominoes = [[1,2],[2,1],[3,4],[5,6]]
输出:1

示例 2:

复制代码
输入:dominoes = [[1,2],[1,2],[1,1],[1,2],[2,2]]
输出:3

提示:

  • 1 <= dominoes.length <= 4 * 104
  • dominoes[i].length == 2
  • 1 <= dominoes[i][j] <= 9
自己的思路和代码:
思路:

开始时,我的思路是两次遍历,和冒泡排序的实现方式差不多,但是我写出一版来显示超出时间限制。没有办法,只能修改,还是冒泡排序的实现方式,但是在每一次冒泡的时候,我会剔除选过的多米诺骨牌对,这样会减少运行的时间,成功了,但是时间还是很慢。

代码:
cpp 复制代码
class Solution {
public:
    int numEquivDominoPairs(vector<vector<int>>& dominoes) {
        int sum = 0;
        int arr[dominoes.size()];
        memset(arr, 0, sizeof(arr));
        for(int i=0; i<dominoes.size()-1; i++) {
            if(arr[i] == 1) continue;
            int temp = 0;
            for(int j=i+1; j<dominoes.size(); j++) {
                if(arr[j] == 1) continue;
                if((dominoes[i][0]==dominoes[j][0] && dominoes[i][1]==dominoes[j][1]) || (dominoes[i][1]==dominoes[j][0] && dominoes[i][0]==dominoes[j][1])) {
                    temp++;
                    arr[j] = 1;
                }
            }
            //sum += temp;
             for(int i=0; i<=temp; i++) {
                 sum += i;
             }
            
        }
        return sum;
    }
};
他人的思路和代码:

因为我自己实现的方法比较暴力,并且运行的时间也不是很理想,所以查看了题解,找了一个比较好的方法。

思路:

本题中我们需要统计所有等价的多米诺骨牌,其中多米诺骨牌使用二元对代表,「等价」的定义是,在允许翻转两个二元对的的情况下,使它们的元素一一对应相等。

于是我们不妨直接让每一个二元对都变为指定的格式,即第一维必须不大于第二维。这样两个二元对「等价」当且仅当两个二元对完全相同。

注意到二元对中的元素均不大于 9,因此我们可以将每一个二元对拼接成一个两位的正整数,即 (x,y)→10x+y。这样就无需使用哈希表统计元素数量,而直接使用长度为 100 的数组即可。

代码:
cpp 复制代码
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;
    }
};
相关推荐
旺仔仔仔19 分钟前
机器人项目实战(5):从单次抓取,到接收指令连续做事
算法
旺仔仔仔27 分钟前
机器人项目实战(2):识别物体、提取点云,再到抓取姿态
算法
姜鱼问生30 分钟前
密码明明一样,为什么 GPG 说“错的“?
后端·算法·架构
启观川44 分钟前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
对空六课1 小时前
指标口径生效时间的版本查询实现
大数据·服务器·前端·算法·数据分析
对空六课1 小时前
RFM分层边界变化的回溯计算
大数据·服务器·前端·数据库·人工智能·算法·数据分析
一勺思维1 小时前
我为什么把 Agent 的核心逻辑从 LangChain 里搬出来手写
算法
碧海银沙音频科技研究院1 小时前
基于炬芯ATS308X的LE aduio LC3编解码算法功能实现
算法
小蒋观天下1 小时前
厂区人员徘徊游荡判别——基于时序轨迹速度的逗留行为分级算法落地
大数据·人工智能·深度学习·算法·机器学习·ai大模型
程序员清风2 小时前
堆与优先队列:从 Top K 到任务调度
java·数据结构·算法