Weekly Contest 146的 等價多米諾骨牌對的數量:數組
給你一個由一些多米諾骨牌組成的列表
dominoes
。dom若是其中某一張多米諾骨牌能夠經過旋轉
0
度或180
度獲得另外一張多米諾骨牌,咱們就認爲這兩張牌是等價的。ui形式上,
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)
的數量。code示例:leetcode
輸入:dominoes = [[1,2],[2,1],[3,4],[5,6]] 輸出:1提示:get
1 <= dominoes.length <= 40000
1 <= dominoes[i][j] <= 9
一開始我是試了一下暴力破解這個方法,惋惜運行超時,只好另想它法了。test
後續參考了Java
中的HashMap
的位桶的設計,思路以下:遍歷
result
表示等價的骨牌對個數,數組arr
表示多米諾骨牌出現的次數,其中數組下標i
(假設骨牌dominoe=[a,b]
,則i=a*10+b
)表示對應的多米諾骨牌,arr[i]
表示該骨牌出現的次數遍歷多米諾骨牌列表dominoes
,對於每一個骨牌dominoe
,假設dominoe=[a,b]
,而後按照如下邏輯處理方法
a*10+b
計算出旋轉0
度時在arr
的下標index1
;使用b*10+a
計算出旋轉180
度是在arr
的下標index2
index1
等於index2
,即表示dominoe
的a
等於b
,此時result
增長arr[index1]
,同時arr[index1]
的值自增(避免多累加一次)便可index1
不等於index2
,即表示dominoe
的a
不等於b
,此時result
增長arr[index1]
,同時arr[index1]
和arr[index2]
都自增。暴力破解的方法會出現運行超時的狀況,這個是一個錯誤的示例,列出來給你們參考一下。
/** * 5130. 等價多米諾骨牌對的數量 * 暴力破解法 * @param dominoes * @return */ public int numEquivDominoPairs(int[][] dominoes) { int result = 0; for (int i = 0; i < dominoes.length; i++) { int a = dominoes[i][0]; int b = dominoes[i][1]; for (int j = i+1; j < dominoes.length; j++) { int c = dominoes[j][0]; int d = dominoes[j][1]; if((a==c && b==d) || (a==d && b==c)){ ++result; } } } return result; }
/** * 5130. 等價多米諾骨牌對的數量 * * @param dominoes * @return */ public int numEquivDominoPairs(int[][] dominoes) { int result = 0; // 因爲1 <= dominoes[i][j] <= 9,因此最大值不會超過99 int[] arr = new int[100]; for (int i = 0; i < dominoes.length; i++) { // 以ij形式表示骨牌對(i,j),這個是翻轉0度(即自己) int index1=dominoes[i][0]*10+dominoes[i][1]; // 翻轉180度後 int index2=dominoes[i][1]*10+dominoes[i][0]; if(index1 == index2){ // i==j,只要累加一次便可 result+=arr[index1]; arr[index1]++; }else{ result+=arr[index1]; arr[index1]++; arr[index2]++; } } return result; }