LeetCode 1128.等价多米诺骨牌对的数量:计数

【LetMeFly】1128.等价多米诺骨牌对的数量:计数

力扣题目链接:https://leetcode.cn/problems/number-of-equivalent-domino-pairs/

给你一组多米诺骨牌 dominoes

形式上,dominoes[i] = [a, b]dominoes[j] = [c, d] 等价 当且仅当 (a == cb == d) 或者 (a == db == c) 。即一张骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌。

在 0 <= i < j < dominoes.length 的前提下,找出满足 dominoes[i] 和 dominoes[j] 等价的骨牌对 (i, j) 的数量。

 

示例 1:

输入:dominoes = [[1,2],[2,1],[3,4],[5,6]]
输出:1

示例 2:

输入:dominoes = [[1,2],[1,2],[1,1],[1,2],[2,2]]
输出:3

 

提示:

  • 1 <= dominoes.length <= 4 * 104
  • dominoes[i].length == 2
  • 1 <= dominoes[i][j] <= 9

解题方法:计数

使用一个哈希表(或数组)统计每多米诺骨牌的出现次数。

既然[1, 2][2, 1]等价,那么不妨将他们视为同一骨牌来看待。

即:当[a, b]a > b时,将[a, b]调整为[b, a]

哈希表如何设计(如何将两个数映射为一个数)?

(a - 1) * 9 + (b - 1)即可。

这样,哈希表的大小9 * 9 = 81即可。

如何计算“对数”?

两种方法:

  1. 统计出每种骨牌出现次数后,遍历哈希表,若这种骨牌出现了 t t t次,则可形成 t ( t − 1 ) 2 \frac{t (t - 1)}{2} 2t(t1)对骨牌

  2. 假设在骨牌 v v v加入哈希表之前哈希表中 v v v出现了 t t t次,那么就先将答案加上 t t t再将哈希表中 v v v出现次数加一。

  • 时间复杂度:方法一 O ( l e n ( d o m i n o e s ) ) O(len(dominoes)) O(len(dominoes));方法二 O ( l e n ( d o m i n o e s ) + C 2 ) O(len(dominoes)+C^2) O(len(dominoes)+C2)。其中 C = 9 C=9 C=9
  • 空间复杂度 O ( C 2 ) O(C^2) O(C2)

AC代码

C++ - 方法二
/** @Author: LetMeFly* @Date: 2025-05-04 14:26:01* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-05-04 15:02:06*/
#if defined(_WIN32) || defined(__APPLE__)
#include "_[1,2]toVector.h"
#endifclass Solution {
private:inline int pair2int(vector<int>& v) {if (v[0] > v[1]) {return (v[1] - 1) * 9 + (v[0] - 1);}return (v[0] - 1) * 9 + (v[1] - 1);}
public:int numEquivDominoPairs(vector<vector<int>>& dominoes) {int times[81] = {0};for (vector<int>& v : dominoes) {times[pair2int(v)]++;}int ans = 0;for (int i = 0; i < 81; i++) {ans += times[i] * (times[i] - 1) / 2;}return ans;}
};
C++ - 方法一
/** @Author: LetMeFly* @Date: 2025-05-04 16:12:00* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-05-04 16:13:46*/
#if defined(_WIN32) || defined(__APPLE__)
#include "_[1,2]toVector.h"
#endifclass Solution {
public:int numEquivDominoPairs(vector<vector<int>>& dominoes) {int times[81] = {0} ;int ans = 0;for (vector<int>& d : dominoes) {ans += times[d[0] < d[1] ? (d[0] - 1) * 9 + d[1] - 1 : (d[1] - 1) * 9 + d[0] - 1]++;}return ans;}
};
Python - 方法一
'''
Author: LetMeFly
Date: 2025-05-04 14:26:12
LastEditors: LetMeFly.xyz
LastEditTime: 2025-05-04 16:10:15
'''
from typing import Listclass Solution:def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:times = [0] * 81ans = 0for a, b in dominoes:v = (a - 1) * 9 + (b - 1) if a < b else (b - 1) * 9 + (a - 1)ans += times[v]times[v] += 1return ans
Java - 方法一
/** @Author: LetMeFly* @Date: 2025-05-04 14:26:15* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-05-04 16:15:28*/
class Solution {public int numEquivDominoPairs(int[][] dominoes) {int[] times = new int[81];int ans = 0;for (int[] d : dominoes) {ans += times[d[0] < d[1] ? (d[0] - 1) * 9 + d[1] - 1 : (d[1] - 1) * 9 + d[0] - 1]++;}return ans;}
}
Go - 方法一
/** @Author: LetMeFly* @Date: 2025-05-04 14:26:18* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-05-04 16:18:34*/
package mainfunc numEquivDominoPairs(dominoes [][]int) (ans int) {times := make([]int, 81)for _, d := range dominoes {var v intif d[0] < d[1] {v = (d[0] - 1) * 9 + d[1] - 1} else {v = (d[1] - 1) * 9 + d[0] - 1}ans += times[v]times[v]++}return
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

以太坊智能合约开发框架:Hardhat v2 核心功能从入门到基础教程

一、设置项目 Hardhat 项目是安装了 hardhat 包并包含 hardhat.config.js 文件的 Node.js 项目。 操作步骤&#xff1a; ①初始化 npm npm init -y②安装 Hardhat npm install --save-dev hardhat③创建 Hardhat 项目 npx hardhat init如果选择 Create an empty hardhat.…

安卓基础(无障碍点击)

无障碍点击核心代码 // 自定义无障碍服务类&#xff0c;继承自Android系统的AccessibilityService public class MyAccessibilityService extends AccessibilityService {// 当系统产生无障碍事件时的回调方法&#xff08;如界面变化、焦点切换等&#xff09;Overridepublic v…

阿里云服务迁移实战: 05-OSS迁移

概述 Bucket 复制分为两种&#xff0c;同区域复制和跨区域复制 同账号复制比较简单&#xff0c;根据提示填写信息即可&#xff0c;本文主要介绍跨账号复制。 同区域复制 授权角色选择 “AliyunOSSRole”, 创建方法见 “跨区域复制”。然后点击确定即可。 跨区域复制 假设我…

Qt 的信号与槽机制依赖元对象系统(Meta-Object System)实现

内部数据结构 在 Qt 中,信号和槽之间的连接主要通过 QObject 类及其相关的私有类进行管理。每个 QObject 实例都维护着一个指向其 QMetaObject 的指针,该对象包含了有关类的所有元信息,包括信号、槽等。此外,还有一个关键的数据结构用于存储信号与槽之间的连接信息,即 Co…

前端面试宝典---性能优化

一、加载优化 1. 第三方模块放在CDN 例如 leaflet通过cdn引入&#xff0c;这样就不会占用打包体积了 2. prefetch 预加载 例如&#xff0c;之后马上有个场景需要一个图片&#xff0c;我们就可以通过link 的 prefetch 对资源进行预先加载 再例如&#xff0c;我们公司是无网络开…

从零开始:Android Studio开发购物车(第二个实战项目)

一年经验的全栈程序员&#xff0c;目前头发健在&#xff0c;但不知道能撑多久。 文章目录 前言 一、页面编写 1. 顶部标签栏title_shopping.xml 2. 商品展现列表activity_shopping_channel.xml 3. 商品详情页面activity_shopping_detail.xml 4. 购物车页面activity_shopping…

PostgteSQL for Everybody基础部分笔记

笔记分享内容参考密歇根大学 Charles Russell Severance 开设的PostgreSQL课程&#xff1a;postgresql-for-everybody&#xff0c;网址为&#xff1a;https://www.coursera.org/specializations/postgresql-for-everybody#courses&#xff0c;在B站等也有相关视频分享。 我分享…

Python项目源码63:病历管理系统1.0(tkinter+sqlite3+matplotlib)

1.病历管理系统包含以下主要功能&#xff1a; 核心功能&#xff1a;病历信息录入&#xff08;患者姓名、年龄、性别、诊断结果、主治医生&#xff09;&#xff0c;自动记录就诊时间&#xff0c;病历信息展示&#xff08;使用Treeview表格&#xff09;&#xff0c;病历信息查询…

MCP底层协议完整通信过程

2025 年是智能体的元年, 也注定是智能体集中爆发的一年! 两个互联领域的重大挑战: 第一、 Agent 与 Tools (工具)的交互 Agent 需要调用外部工具和 API

docker:制作镜像+上传镜像+拉取镜像

1.dockerfile制作镜像 示例内容&#xff1a; 1.创建一个index.js的文件 console.log("hello world")2.在相同目录下创建名为dockerfile的文件 FROM node:alpine COPY index.js /index.js CMD node /index.js3.构建镜像 docker build -t minterra/hello-docker . …

docker制作python大模型镜像(miniconda环境),工程改造记录

**环境说明&#xff1a;**从系统镜像开始打造python大模型镜像&#xff0c;之前是人工手动装的方式&#xff0c;并且模型和依赖在公网中&#xff0c;对于离线交付环境不太友好&#xff0c;所以打造的离线化交付版本 Dockerfile: FROM centos:7.9 ENV PYTHONIOENCODINGutf-8 E…

Rust中避免过度使用锁导致性能问题的策略

一、引言 在 Rust 多线程编程中&#xff0c;锁是实现线程同步的重要工具&#xff0c;它可以防止多个线程同时访问和修改共享数据&#xff0c;从而避免数据竞争和不一致的问题。然而&#xff0c;过度使用锁会带来严重的性能问题&#xff0c;如锁竞争导致的线程阻塞、上下文切换…

数据结构每日一题day15(链表)★★★★★

题目描述&#xff1a;将一个带头结点的单链表A分解为两个带头结点的单链表A和 B,使得A表中含有原表中序号为奇数的元素,而B表中含有原表中序号为偶数的元素,且保持相对顺不变&#xff0c;最后返回 B 表。 算法思想&#xff1a; 1.初始化&#xff1a; 创建新链表 B 的头结点。…

【杂谈】-探索 NVIDIA Dynamo 的高性能架构

探索 NVIDIA Dynamo 的高性能架构 文章目录 探索 NVIDIA Dynamo 的高性能架构1. 大规模人工智能推理的日益严峻的挑战2. 使用 NVIDIA Dynamo 优化 AI 推理3. 实际应用和行业影响4. 竞争优势&#xff1a;Dynamo 与其他方案对比5. 总结 随着人工智能&#xff08;AI&#xff09;技…

postgresql数据库基本操作

1. 连接 PostgreSQL 数据库 首先&#xff0c;使用 psql 命令行工具连接到数据库。如果是本地连接&#xff0c;命令格式如下&#xff1a; psql -U postgres -d <数据库名称> -h <主机地址>其中&#xff1a; -U postgres&#xff1a;表示以 postgres 用户身份登录…

工业大模型:从设备诊断到工艺重构

引言 工业大模型正在引发制造业认知革命。据埃森哲研究,到2026年全球工业大模型市场规模将突破280亿美元,其中工艺优化应用占比达42%。本文将系统解析工业大模型的"预训练-领域适配-应用落地"技术路径,并通过设备健康诊断与工艺参数生成的实践案例,展示如何构建…

PyQt5基本介绍

PyQt5是基于Digia公司强大图形框架Qt5的python接口&#xff0c;由一组python模块构成。是一个用于创建桌面应用程序的Python库&#xff0c;它是Qt图形用户界面工具包的Python绑定。 Qt是一个跨平台的C库&#xff0c;提供了一套丰富的工具和功能&#xff0c;用于开发图形用户界…

Tire 树(字典树/前缀树)

一、定义与结构 用来快速存储查找字符串集合的一种数据结构 将字符串按顺序连接根节点上&#xff0c;并在字符串结束的地方打上标记并计数。 二、模板题 acwing 835 Trie 树的字符串统计 题目&#xff1a; 维护一个字符串集合&#xff0c;支持两种操作&#xff1a; I x 向…

【时时三省】(C语言基础)怎样定义和引用一维数组

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 一维数组是数组中最简单的&#xff0c;它的元素只需要用数组名加一个下标&#xff0c;就能唯一地确定。如上面介绍的学生成绩数组s就是一维数组。有的数组&#xff0c;其元素要指定两个下标才…

编译faiss

编译faiss-1.10.0 首先确保自己cmake的版本&#xff1a; cmake --version 确保其版本至少为CMake 3.24.0 or higher is required。 其次安装OpenBLAS&#xff1a; https://github.com/OpenMathLib/OpenBLAS 去这里去安转Openblas内容&#xff0c;然后确保自己的CPU的指令集是存…