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

等价多米诺骨牌对的数量

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

题目:

给你一组多米诺骨牌 dominoes

形式上,dominoes[i] = [a, b]dominoes[j] = [c, d] 等价 当且仅当 (a == cb == d) 或者 (a == db == 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;
    }
};
相关推荐
寂静山林3 分钟前
UVa 10989 Bomb Divide and Conquer
算法
兮山与28 分钟前
算法23.0
算法
共享家95271 小时前
数独系列算法
算法·深度优先
程序员三藏1 小时前
Postman持久化保存/设置断言详解
自动化测试·软件测试·python·测试工具·职场和发展·接口测试·postman
liebe1*12 小时前
C语言程序代码(四)
c语言·数据结构·算法
进击的圆儿2 小时前
递归专题4 - 网格DFS与回溯
数据结构·算法·递归回溯
程序猿20232 小时前
Python每日一练---第一天:买卖股票的最佳时机
算法
夏鹏今天学习了吗3 小时前
【LeetCode热题100(56/100)】组合总和
算法·leetcode·职场和发展
ZPC82103 小时前
opencv 获取图像中物体的坐标值
人工智能·python·算法·机器人
颇有几分姿色3 小时前
密码学算法分类指南
算法·密码学