LeetCode-Python-1128. 等价多米诺骨牌对的数量

给你一个由一些多米诺骨牌组成的列表 dominoes

如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的。

形式上,dominoes[i] = [a, b] 和 dominoes[j] = [c, d] 等价的前提是 a==c 且 b==d,或是 a==d 且 b==c

在 0 <= i < j < dominoes.length 的前提下,找出满足 dominoes[i] 和 dominoes[j] 等价的骨牌对 (i, j) 的数量。

 

示例:

输入:dominoes = [[1,2],[2,1],[3,4],[5,6]]
输出:1

 

提示:

  • 1 <= dominoes.length <= 40000
  • 1 <= dominoes[i][j] <= 9

第一种思路:

数据规模是40,000,所以O(N^2)是不行滴,稳定超时,

那么就用哈希表实现O(N)的算法吧,开辟一个defaultdict的哈希表, key是多米诺骨牌的值,value是这种多米诺骨牌出现的频率,

然后线性遍历输入数组,每次查找已经出现过的等价的多米诺骨牌的频率,查找完成后把当前的多米诺骨牌的频率 + 1。

注意处理当多米诺骨牌的两个值相等时的特殊情况。

class Solution(object):
    def numEquivDominoPairs(self, dominoes):
        """
        :type dominoes: List[List[int]]
        :rtype: int
        """
        from collections import defaultdict
        dic = defaultdict(int)
        res = 0
        for i, x in enumerate(dominoes):
            # print dic[(x[0], x[1])], dic[(x[1],x[0])], (x[0], x[1])
            if x[0] != x[1]:
                res += dic[(x[0], x[1])] + dic[(x[1],x[0])]
            else:
                res += dic[(x[0], x[1])]
            dic[(x[0], x[1])] += 1
            
        return res

第二种思路:

如果把每个多米诺骨牌的值排好序,那么就不用考虑两个值相等的特殊情况了。

class Solution(object):
    def numEquivDominoPairs(self, dominoes):
        """
        :type dominoes: List[List[int]]
        :rtype: int
        """
        from collections import defaultdict
        dic = defaultdict(int)
        res = 0
        for i, x in enumerate(dominoes):
            pair = (x[1], x[0])
            if x[0] < x[1]:
                pair = (x[0], x[1])
            res += dic[pair]
            dic[pair] += 1
            
        return res

 

你可能感兴趣的:(Leetcode,数组)