20210126 等价多米诺骨牌对的数量

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-equivalent-domino-pairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 public int numEquivDominoPairs(int[][] dominoes) {

    }

思路:

可以用纯hash计算 也可以对数组排序后插入set  数组长度-set个数是结果

    public static int numEquivDominoPairs(int[][] dominoes) {
        HashSet s = new HashSet();
        for(int[] domin:dominoes){
            Arrays.sort(domin);
//            s.add(domin);数组指向地址而不是值 所以set去重失效
            s.add(String.valueOf(domin[0]+domin[1]));
        }
        return dominoes.length-s.size();
    }

提交[[1,2],[1,2],[1,1],[1,2],[2,2]]失败  预期结果为3

 

思路错误 题意理解错误 如[[1,2],[1,2],[1,1],[1,2],[2,2]]是要依次从左到右获取等价的数组 这组中[1,2]等价的

第一个[1,2]依次和后面的对比 后面有2个[1,2] 

第二个[1,2]后面有1个[1,2]

第三个[1,2]后面没有

所以有2+1=3个

说白了[1,2]看成一个对象 共有3个[1,2]对象 这3个对象两两配对 共有3个组合

 

初中学过二次项公式 如上有3个相同对象 C32=3x(3-1)/2=3 能算出两两配对组合个数

 

重新思考思路

把同类的对象个数分别存到数组上

再用遍历用二次项公式取值

 public int numEquivDominoPairs(int[][] dominoes) {
        int[] map = new int[100];
        int res = 0;
        for(int i = 0; i < dominoes.length; i++){
            int m = dominoes[i][0];
            int n = dominoes[i][1];
            int k = m > n ? m * 10 + n : n * 10 + m;
            map[k] ++;
        }
        for(int i = 0; i < 100; i++){
            res += map[i] * (map[i] - 1) / 2;
        }
        return res;
    }

 

posted @ 2021-01-27 01:09  小白小白小白小白  阅读(92)  评论(0编辑  收藏  举报