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

发布于:2025-02-15 ⋅ 阅读:(17) ⋅ 点赞:(0)

等价多米诺骨牌对的数量

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
自己的思路和代码:
思路:

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

代码:
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 的数组即可。

代码:
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;
    }
};