leetcode 1128. 等价多米诺骨牌对的数量

95 阅读1分钟

[toc] leetcode 1128. 等价多米诺骨牌对的数量

题目描述

  1. 等价多米诺骨牌对的数量

给你一个由一些多米诺骨牌组成的列表 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

解题思路

法1

哈希表:

函数使用一个map(count),其中键是多米诺骨牌的排序后的值(保证了等价骨牌的统一表示),值是该骨牌的出现次数。

首先,遍历dominoes列表,将每个多米诺骨牌进行排序,并将排序后的骨牌作为键存入count中。

然后,遍历count中的值(多米诺骨牌的出现次数),将每个值都加入到结果中,根据组合公式计算等价多米诺骨牌对的数量。

最后返回结果。

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

执行结果

法1

func numEquivDominoPairs(dominoes [][]int) int {
	count := make(map[[2]int]int)
	result := 0

	for _, domino := range dominoes {
		if domino[0] > domino[1] {
			domino[0], domino[1] = domino[1], domino[0]
		}
		count[[2]int{domino[0], domino[1]}]++
	}

	for _, c := range count {
		result += c * (c - 1) / 2
	}

	return result
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 28 ms , 在所有 Go 提交中击败了 65.22% 的用户 内存消耗: 7.9 MB , 在所有 Go 提交中击败了 30.43% 的用户 通过测试用例: 19 / 19 炫耀一下:

本文由mdnice多平台发布