LeetCode 1128.等价多米诺骨牌
题目
给你一个由一些多米诺骨牌组成的列表 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.等价多米诺骨牌相关推荐
- LeetCode 1128. 等价多米诺骨牌对的数量(哈希)
1. 题目 给你一个由一些多米诺骨牌组成的列表 dominoes. 如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的. 形式上,dominoe ...
- leetcode 1128. 等价多米诺骨牌对的数量
给你一个由一些多米诺骨牌组成的列表 dominoes. 如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的. 形式上,dominoes[i] = ...
- 【每日一题】 1128. 等价多米诺骨牌对的数量
[每日一题] 1128. 等价多米诺骨牌对的数量 避免每日太过咸鱼,一天搞定一道LeetCode算法题 一.题目描述 给你一个由一些多米诺骨牌组成的列表 dominoes. 如果其中某一张多米诺骨牌可 ...
- 1128. 等价多米诺骨牌对的数量
链接:1128. 等价多米诺骨牌对的数量 题解: class Solution {public:int numEquivDominoPairs(vector<vector<int>& ...
- 刷爆力扣之等价多米诺骨牌对的数量
刷爆力扣之等价多米诺骨牌对的数量 HELLO,各位看官大大好,我是阿呆
- C++描述 LeetCode1128. 等价多米诺骨牌对的数量
C++描述 LeetCode1128. 等价多米诺骨牌对的数量 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博 ...
- 等价多米诺骨牌对的数量
给你一个由一些多米诺骨牌组成的列表 dominoes. 如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的. 形式上,dominoes[i] = ...
- 每日一题:leetcode1128.等价多米诺骨牌对数
题目描述 题目分析 看到题目以后第一个想法是遍历数组,对每个元素有一个数据结构中保存了该元素出现的次数,然后往结果中相加(表示该元素和前面的对数),然后再将元素出现的次数加一. 思考用什么数据结构保存 ...
- LeetCode 838. 推多米诺(模拟)
文章目录 1. 题目 2. 解题 1. 题目 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相 ...
最新文章
- html调用asp边疆,[求助]怎么实现ASP在HTML中调用
- BestCoder-Round#38
- oracle shrink space compact,oracle 学习笔记 Shrink 参数 compact
- [Java基础]IO流小结
- 【leetcode 简单】第四十二题 阶乘后的零
- 输入单个空格字符_字符美化丶替换丶转换
- 具有多个单元格类型的iOS UITableView
- mysql多表结果合并查询
- Linux 挂载光盘镜像配置本地 yum 源安装软件
- BRAF蛋白F595S G615R突变的影响
- PHP最好的语言的梗的笑话
- 大会员 python
- RedHat7.8安装Microsoft Edge浏览器
- k3595参数_常用晶体管参数大全
- php 实现保留两位小数
- scrapy中用来代替crawl 功能的main文件配置
- python爬虫之爬取简书中的小文章标题
- tomcat的部署 tar.gz
- 一文读懂开源日志管理方案 ELK 和 EFK 的区别
- 0-1背包问题及python实现
热门文章
- 【私藏好用】将bmap地图,Quik等五款软件打包送你端午节礼物
- Unity3D自动旋转屏幕
- nginx配置多个一级域名https访问的配置
- java 带t日期格式转换_自我整理:java 日期转换
- Nginx配置https(ssl证书)并反向代理Springboot Jar项目
- 乾颐堂安德华为数通HCNA真题解析版(第2部分)
- python实现微信hook_GitHub - zhouxionger/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...
- 计算机信息系统安全管理包括什么,计算机信息系统的运行安全包括什么
- C语言中调用数组元素的三种方法:下标法、数组名法、指针法
- 计算机学院考研动员大会,计算机学院2018年考研动员大会顺利召开