0
点赞
收藏
分享

微信扫一扫

【Leetcode】1128. Number of Equivalent Domino Pairs

安七月读书 2022-04-17 阅读 43

题目地址:

https://leetcode.com/problems/number-of-equivalent-domino-pairs/

给定一个长 n n n数组 A A A,其中每个元素都是长 2 2 2的数组,并且所有数字都是 1 ∼ 9 1\sim 9 19。问有多少个数对 i , j , i ≠ j i,j, i\ne j i,j,i=j使得 A [ i ] [ 0 ] = A [ j ] [ 0 ] ∧ A [ i ] [ 1 ] = A [ j ] [ 1 ] A[i][0]=A[j][0] \land A[i][1]=A[j][1] A[i][0]=A[j][0]A[i][1]=A[j][1]或者 A [ i ] [ 0 ] = A [ j ] [ 1 ] ∧ A [ i ] [ 1 ] = A [ j ] [ 0 ] A[i][0]=A[j][1] \land A[i][1]=A[j][0] A[i][0]=A[j][1]A[i][1]=A[j][0]

对于每个 A [ i ] A[i] A[i],将其哈希成 max ⁡ { A [ i ] [ 0 ] , A [ i ] [ 1 ] } ∗ 10 + min ⁡ { A [ i ] [ 0 ] , A [ i ] [ 1 ] } \max\{A[i][0],A[i][1]\}*10+\min\{A[i][0],A[i][1]\} max{A[i][0],A[i][1]}10+min{A[i][0],A[i][1]},这样可以保证满足条件的两个元素的哈希值一定相等,并且反之也成立。接下来只需要开一个哈希表,在循环的时候记录每个小数组已经出现的次数即可。代码如下:

import java.util.HashMap;
import java.util.Map;

public class Solution {
    public int numEquivDominoPairs(int[][] dominoes) {
        int res = 0;
        Map<Integer, Integer> map = new HashMap<>();
        for (int[] p : dominoes) {
            int hash = Math.max(p[0], p[1]) * 10 + Math.min(p[0], p[1]);
            int cnt = map.getOrDefault(hash, 0);
            res += cnt;
            map.put(hash, cnt + 1);
        }
        
        return res;
    }
}

时空复杂度 O ( n ) O(n) O(n)

举报

相关推荐

0 条评论