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; }