题目

给你一个由一些多米诺骨牌组成的列表 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.0暴力(超时)

直接双循环 第一层i,第二层j i<j<len(dominoes) 一个一个判断是否等价,是就ans加一 这个方法直接抛弃,O(n^2),太慢

2.0 字典

既然直接一个一个比对太慢,自然就想到之前经常处理这种问题的方法,字典大法(hashtable) 遍历一遍,存在字典里,计数,例如[1,2](or[2,1])有4个 那就有c[4,2](组合数)等价的两张牌

class Solution:def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:ans = 0 d = {}for a,b in dominoes:x= str(a) + str(b) if a<b else str(b)+str(a)d[x] = d.get(x,0)+1for k ,v in d.items():ans += v*(v-1)//2return ans

可以再改进一下,每次发现相同的x时候,相当于增加了d[x]种等价的匹配
就一次遍历完成

class Solution:def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:ans = 0 d = {}for a,b in dominoes:x= str(a) + str(b) if a<b else str(b)+str(a)ans += d.get(x,0)d[x] = d.get(x,0)+1return ans

3.0 状态压缩

因为数字不超过9,可以用4位表示一个数a,再来4位表示b,总共8位表示一种状态,用一个整数来取代字典的作用。然后需要大小为2^8 = 256的数组来保存

class Solution:def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:ans = 0 count = [0]*256for a,b in dominoes:if a>b:v = a << 4 | belse:v = b << 4 | aans += count[v]count[v] += 1return ans

状态压缩优化

因为都是小于9的数,可以用9进制进一步压缩,2进制有些浪费,没有体现压缩的优势

class Solution:def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:ans = 0 count = [0]*9*9for a, b in dominoes:x = (a-1)*9+(b-1) if a<b else (b-1)*9+(a-1)ans += count[x]count[x] +=1return ans

LeetCode 1128.等价多米诺骨牌相关推荐

  1. LeetCode 1128. 等价多米诺骨牌对的数量(哈希)

    1. 题目 给你一个由一些多米诺骨牌组成的列表 dominoes. 如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的. 形式上,dominoe ...

  2. leetcode 1128. 等价多米诺骨牌对的数量

    给你一个由一些多米诺骨牌组成的列表 dominoes. 如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的. 形式上,dominoes[i] = ...

  3. 【每日一题】 1128. 等价多米诺骨牌对的数量

    [每日一题] 1128. 等价多米诺骨牌对的数量 避免每日太过咸鱼,一天搞定一道LeetCode算法题 一.题目描述 给你一个由一些多米诺骨牌组成的列表 dominoes. 如果其中某一张多米诺骨牌可 ...

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

    链接:1128. 等价多米诺骨牌对的数量 题解: class Solution {public:int numEquivDominoPairs(vector<vector<int>& ...

  5. 刷爆力扣之等价多米诺骨牌对的数量

    刷爆力扣之等价多米诺骨牌对的数量 HELLO,各位看官大大好,我是阿呆

  6. C++描述 LeetCode1128. 等价多米诺骨牌对的数量

    C++描述 LeetCode1128. 等价多米诺骨牌对的数量   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博 ...

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

    给你一个由一些多米诺骨牌组成的列表 dominoes. 如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的. 形式上,dominoes[i] = ...

  8. 每日一题:leetcode1128.等价多米诺骨牌对数

    题目描述 题目分析 看到题目以后第一个想法是遍历数组,对每个元素有一个数据结构中保存了该元素出现的次数,然后往结果中相加(表示该元素和前面的对数),然后再将元素出现的次数加一. 思考用什么数据结构保存 ...

  9. LeetCode 838. 推多米诺(模拟)

    文章目录 1. 题目 2. 解题 1. 题目 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相 ...

最新文章

  1. html调用asp边疆,[求助]怎么实现ASP在HTML中调用
  2. BestCoder-Round#38
  3. oracle shrink space compact,oracle 学习笔记 Shrink 参数 compact
  4. [Java基础]IO流小结
  5. 【leetcode 简单】第四十二题 阶乘后的零
  6. 输入单个空格字符_字符美化丶替换丶转换
  7. 具有多个单元格类型的iOS UITableView
  8. mysql多表结果合并查询
  9. Linux 挂载光盘镜像配置本地 yum 源安装软件
  10. BRAF蛋白F595S G615R突变的影响
  11. PHP最好的语言的梗的笑话
  12. 大会员 python
  13. RedHat7.8安装Microsoft Edge浏览器
  14. k3595参数_常用晶体管参数大全
  15. php 实现保留两位小数
  16. scrapy中用来代替crawl 功能的main文件配置
  17. python爬虫之爬取简书中的小文章标题
  18. tomcat的部署 tar.gz
  19. 一文读懂开源日志管理方案 ELK 和 EFK 的区别
  20. 0-1背包问题及python实现

热门文章

  1. 【私藏好用】将bmap地图,Quik等五款软件打包送你端午节礼物
  2. Unity3D自动旋转屏幕
  3. nginx配置多个一级域名https访问的配置
  4. java 带t日期格式转换_自我整理:java 日期转换
  5. Nginx配置https(ssl证书)并反向代理Springboot Jar项目
  6. 乾颐堂安德华为数通HCNA真题解析版(第2部分)
  7. python实现微信hook_GitHub - zhouxionger/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...
  8. 计算机信息系统安全管理包括什么,计算机信息系统的运行安全包括什么
  9. C语言中调用数组元素的三种方法:下标法、数组名法、指针法
  10. 计算机学院考研动员大会,计算机学院2018年考研动员大会顺利召开