文章目录
- 
- 
- [1. 题目链接](#1. 题目链接)
 - [2. 题目描述](#2. 题目描述)
 - [3. 题目示例](#3. 题目示例)
 - [4. 解题思路](#4. 解题思路)
 - [5. 题解代码](#5. 题解代码)
 - [6. 复杂度分析](#6. 复杂度分析)
 
 
 - 
 
1. 题目链接
1128. 等价多米诺骨牌对的数量 - 力扣(LeetCode)
2. 题目描述
给你一组多米诺骨牌 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) 的数量。
3. 题目示例
示例 1 :
            
            
              plain
              
              
            
          
          输入:dominoes = [[1,2],[2,1],[3,4],[5,6]]
输出:1
        示例 2 :
            
            
              plain
              
              
            
          
          输入:dominoes = [[1,2],[1,2],[1,1],[1,2],[2,2]]
输出:3
        4. 解题思路
- 问题理解 :
- 给定一组多米诺骨牌,每个骨牌由两个数字表示,如 
[a, b]。 - 两个骨牌 
[a, b]和[c, d]是等价的,如果a == c && b == d或a == d && b == c。 - 需要统计所有等价骨牌对的数量。
 
 - 给定一组多米诺骨牌,每个骨牌由两个数字表示,如 
 - 关键思路 :
- 将每个骨牌标准化为 
[min(a, b), max(a, b)],这样可以统一等价骨牌的表示形式。 - 使用一个二维数组 
cnt来统计每种标准化骨牌的出现次数。 - 对于每个骨牌,其等价对的数量就是之前已经出现的相同标准化骨牌的数量。
 
 - 将每个骨牌标准化为 
 - 优化点 :
- 标准化处理避免了重复比较,直接通过计数数组快速查询和更新。
 - 时间复杂度为 
O(n),空间复杂度为O(1)(因为cnt的大小固定为10x10)。 
 
5. 题解代码
            
            
              java
              
              
            
          
          class Solution {
    public int numEquivDominoPairs(int[][] dominoes) {
        int ans = 0; // 初始化等价骨牌对的数量
        int[][] cnt = new int[10][10]; // 创建一个10x10的计数数组,用于统计每种骨牌的出现次数
        
        for (int[] d : dominoes) { // 遍历每个骨牌
            int a = Math.min(d[0], d[1]); // 获取骨牌中的较小值
            int b = Math.max(d[0], d[1]); // 获取骨牌中的较大值,保证a <= b
            ans += cnt[a][b]++; // 将当前骨牌的计数加到ans中,并更新计数
        }
        
        return ans; // 返回等价骨牌对的总数
    }
}
        6. 复杂度分析
- 时间复杂度 :
- 遍历所有骨牌需要 
O(n)时间,其中n是骨牌的数量。 - 每个骨牌的处理(标准化和计数更新)是 
O(1)操作。 - 总时间复杂度为 
O(n)。 
 - 遍历所有骨牌需要 
 - 空间复杂度 :
- 使用了一个固定大小的二维数组 
cnt,大小为10x10,因此空间复杂度为O(1)。 
 - 使用了一个固定大小的二维数组