LeetCode1128 等價多公尺諾骨牌對的數量

2021-10-17 14:12:39 字數 1838 閱讀 8368

目錄

一、題目

二、示例

三、思路

四、**

給你乙個由一些多公尺諾骨牌組成的列表 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

首先,先對列表進行排序。先將列表中的元素按照大小進行排序,之後再整體排序。

例如,將列表dominoes = [[2, 1], [1, 2], [1, 2], [1, 2], [2, 1], [1, 1], [1, 2], [2, 2]]進行排序得到,

dominoes = [[1, 1], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [2, 2]

tmp 變數計算相同骨牌的數量,利用 reduce函式計算 1 到 n 的和。例如,當列表中有3組骨牌相同,那麼他們可以組成 2 + 1 對。

最後,返回總數即可。

from functools import reduce

class solution:

def numequivdominopairs(self, dominoes) -> int:

""":param dominoes: list[list[int]]

:return: int

"""counts = 0

# 排序

for i in dominoes:

i.sort()

dominoes.sort()

# print(dominoes)

tmp = 1

for j in range(len(dominoes) - 1):

if dominoes[j] == dominoes[j + 1]:

tmp += 1

else:

counts += reduce(lambda x, y: x + y, range(1, tmp)) if tmp >= 2 else 0

tmp = 1

return counts

if __name__ == '__main__':

# dominoes = [[1, 2], [2, 1], [3, 4], [5, 6]]

# dominoes = [[1, 2], [1, 2], [1, 1], [1, 2], [2, 2]]

# dominoes = [[2, 2], [1, 2], [1, 2], [1, 1], [1, 2], [1, 1], [2, 2]]

dominoes = [[2, 1], [1, 2], [1, 2], [1, 2], [2, 1], [1, 1], [1, 2], [2, 2]]

s = solution()

ans = s.numequivdominopairs(dominoes)

print(ans)

1128 等價多公尺諾骨牌的數量

給你乙個由一些多公尺諾骨牌組成的列表 dominoes。如果其中某一張多公尺諾骨牌可以通過旋轉 0 度或 180 度得到另一張多公尺諾骨牌,我們就認為這兩張牌是等價的。形式上,dominoes i a,b 和 dominoes j c,d 等價的前提是 ac 且 bd,或是 ad 且 bc。在 0 ...

1128 等價多公尺諾骨牌對的數量

給你乙個由一些多公尺諾骨牌組成的列表 dominoes。如果其中某一張多公尺諾骨牌可以通過旋轉 0 度或 180 度得到另一張多公尺諾骨牌,我們就認為這兩張牌是等價的。形式上,dominoes i a,b 和 dominoes j c,d 等價的前提是 a c 且 b d,或是 a d 且 b c。...

1128 等價多公尺諾骨牌對的數量

題目描述 給你乙個由一些多公尺諾骨牌組成的列表 dominoes。如果其中某一張多公尺諾骨牌可以通過旋轉 0 度或 180 度得到另一張多公尺諾骨牌,我們就認為這兩張牌是等價的。形式上,dominoes i a,b 和 dominoes j c,d 等價的前提是 ac 且 bd,或是 ad 且 bc...