给你一个由一些多米诺骨牌组成的列表 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
/** * @param {number[][]} dominoes * @return {number} */ var numEquivDominoPairs = function(dominoes) { let hash = new Map(); let ans = 0; for(let dom of dominoes){ let key=dom.sort((a,b)=>a-b).join(":"); let val = hash.get(key)||0 if(val>0){ ans+=val; } hash.set(key,val+1); } return ans; };
let hash={} let memo={} for(let i=0;i<dominoes.length;i++){ let [f,e]=dominoes[i] let min=Math.min(f,e) let max=Math.max(f,e) if(hash[min+' '+max]==null)hash[min+' '+max]=1 else hash[min+' '+max]++ } let res=0 for(let k in hash){ res+=add(hash[k]-1) } return res function add(n){ let res=0 for(let i=1;i<=n;i++){ res+=i } return res }
反思:
悲哀,自己只会用双层for循环,导致测试用例总是超出时间限制,所以存在效率性问题可以考虑下set、map数据结构。