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

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

猜你喜欢

转载自www.cnblogs.com/zhangzs000/p/11223242.html