【Leetcode 每日一题 - 补卡】1128. 等价多米诺骨牌对的数量
问题背景
给你一组多米诺骨牌 d o m i n o e s dominoes dominoes。
形式上, d o m i n o e s [ i ] = [ a , b ] dominoes[i] = [a, b] dominoes[i]=[a,b] 与 d o m i n o e s [ j ] = [ c , d ] dominoes[j] = [c, d] dominoes[j]=[c,d] 等价 当且仅当 ( a = c a = c a=c 且 b = d b = d b=d ) 或者 ( a = d a = d a=d 且 b = c b = c b=c ) 。即一张骨牌可以通过旋转 0 0 0 度或 180 180 180 度得到另一张多米诺骨牌。
在 0 ≤ i < j < d o m i n o e s . l e n g t h 0 \le i < j < dominoes.length 0≤i<j<dominoes.length 的前提下,找出满足 d o m i n o e s [ i ] dominoes[i] dominoes[i] 和 d o m i n o e s [ j ] dominoes[j] dominoes[j] 等价的骨牌对 ( i , j ) (i, j) (i,j) 的数量。
数据约束
- 1 ≤ d o m i n o e s . l e n g t h ≤ 4 × 1 0 4 1 \le dominoes.length \le 4 \times 10 ^ 4 1≤dominoes.length≤4×104
- d o m i n o e s [ i ] . l e n g t h = 2 dominoes[i].length = 2 dominoes[i].length=2
- 1 ≤ d o m i n o e s [ i ] [ j ] ≤ 9 1 \le dominoes[i][j] \le 9 1≤dominoes[i][j]≤9
解题过程
包含相同元素的二元组等价,求等价的二元组数量。
实际上只要用哈希表记录元素相同的二元组数量即可,考虑到数据范围不大,用二维数组就行了。
具体实现
class Solution {public int numEquivDominoPairs(int[][] dominoes) {int res = 0;int[][] cnt = new int[10][10];for (int[] dominoe : dominoes) {int min = Math.min(dominoe[0], dominoe[1]);int max = Math.max(dominoe[0], dominoe[1]);res += cnt[min][max]++;}return res;}
}