【数据结构和算法】 相等行列对

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

2.1 三层循环

2.2 哈希 + 二层循环

三、代码

3.1 三层循环

3.2 哈希 + 二层循环

四、复杂度分析

4.1 三层循环

4.2 哈希 + 二层循环


前言

这是力扣的 2352 题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。


一、题目描述

给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ,返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目

如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。

示例 1:

输入:grid = [[3,2,1],[1,7,6],[2,7,7]]
输出:1
解释:存在一对相等行列对:
- (第 2 行,第 1 列):[2,7,7]

示例 2:

输入:grid = [[3,1,2,2],[1,4,4,5],[2,4,2,2],[2,4,2,2]]
输出:3
解释:存在三对相等行列对:
- (第 0 行,第 0 列):[3,1,2,2]
- (第 2 行, 第 2 列):[2,4,2,2]
- (第 3 行, 第 2 列):[2,4,2,2]

提示:

  • n == grid.length == grid[i].length
  • 1 <= n <= 200
  • 1 <= grid[i][j] <= 105

二、题解

2.1 三层循环

思路与算法:

我们直接将矩阵 gridgridgrid 的每一行和每一列进行比较,如果相等,那么就是一对相等行列对,答案加一。

2.2 哈希 + 二层循环

思路与算法:

这道题暴力解:遍历每一列,然后遍历每一行,再比对当前行和当前列是否以相同顺序包含相同元素。

遍历每一行的时间复杂度为O(n^2),再套上一层遍历每一列时间复杂度就为O(n^3)。

我们可以发现,我们其实在遍历每一列的时候都在重复的遍历每一行,那么我们可以使用哈希表来存储每一行的数字序列字符串。

然后在遍历每一个行的时候生成这一行对应的数字序列字符串,哈希表中记录有这个数字序列字符串的个数就是对应的行列对个数。

如果直接把数字进行拼接会造成歧义,可能不同的数字会有相同数字序列字符串。因此每一个数字之后添加一个标识符%进行区分。

图解

以示例2进行图解


三、代码

3.1 三层循环

Java版本:

class Solution {public int equalPairs(int[][] grid) {int n = grid.length;int ans = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {int ok = 1;for (int k = 0; k < n; ++k) {if (grid[i][k] != grid[k][j]) {ok = 0;break;}}ans += ok;}}return ans;}
}

C++版本:

class Solution {
public:int equalPairs(vector<vector<int>>& grid) {int n = grid.size();int ans = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {int ok = 1;for (int k = 0; k < n; ++k) {if (grid[i][k] != grid[k][j]) {ok = 0;break;}}ans += ok;}}return ans;}
};

Python版本:

class Solution:def equalPairs(self, grid: List[List[int]]) -> int:g = [list(col) for col in zip(*grid)]return sum(row == col for row in grid for col in g)

3.2 哈希 + 二层循环

Java版本:

class Solution {public int equalPairs(int[][] grid) {int n = grid.length;    // 矩阵尺寸Map<String, Integer> rowSeqCount = new HashMap<>();     // 存储行数字序列字符串的哈希表StringBuilder sb ;      // 用于生成数字序列字符串String rowSeq;          // 数字序列字符串for(int i = 0; i < n; i++){     // 遍历每一行sb = new StringBuilder();   // 每一行新建一个对象// 生成行数字序列字符串for(int j = 0; j < n; j++){sb.append(grid[i][j]);sb.append('%');}rowSeq = sb.toString(); // 哈希表记录这个数字序列字符串个数rowSeqCount.put(rowSeq, rowSeqCount.getOrDefault(rowSeq, 0) + 1);}int count = 0;for(int j = 0; j < n; j++){     // 遍历每一列sb = new StringBuilder();   // 每一列新建一个对象// 生成列数字序列字符串for(int i = 0; i < n; i++){sb.append(grid[i][j]);sb.append('%');}rowSeq = sb.toString();// 从哈希表中查询是和这个列数字序列字符串相同的行数字序列字符串的个数count += rowSeqCount.getOrDefault(rowSeq, 0);}return count; }
}

C++版本:

class Solution {
public:int equalPairs(std::vector<std::vector<int>>& grid) {int n = grid.size(); // 矩阵尺寸std::unordered_map<std::string, int> row_seq_count; // 存储行数字序列字符串的哈希表for (int i = 0; i < n; i++) { // 用于生成数字序列字符串std::string row_seq = ""; // 每一行新建一个字符串// 生成行数字序列字符串for (int j = 0; j < n; j++) {row_seq += std::to_string(grid[i][j]) + "%";}// 哈希表记录这个数字序列字符串个数row_seq_count[row_seq] = row_seq_count[row_seq] + 1;}int count = 0;for (int j = 0; j < n; j++) { // 遍历每一列std::string row_seq = ""; // 每一列新建一个对象// 生成列数字序列字符串for (int i = 0; i < n; i++) {row_seq += std::to_string(grid[i][j]) + "%";}// 从哈希表中查询是和这个列数字序列字符串相同的行数字序列字符串的个数count += row_seq_count[row_seq];}return count;}
};

Python版本:

class Solution:def equalPairs(self, grid: List[List[int]]) -> int:n = len(grid)       # 矩阵尺寸row_seq_count = {}  # 存储行数字序列字符串的哈希表for i in range(n):  # 用于生成数字序列字符串row_seq = ""    # 每一行新建一个字符串# 生成行数字序列字符串for j in range(n):  row_seq += f"{grid[i][j]}%"# 哈希表记录这个数字序列字符串个数row_seq_count[row_seq] = row_seq_count.get(row_seq, 0) + 1count = 0for j in range(n):  # 遍历每一列row_seq = ""    # 每一列新建一个对象# 生成列数字序列字符串for i in range(n):row_seq += f"{grid[i][j]}%"# 从哈希表中查询是和这个列数字序列字符串相同的行数字序列字符串的个数count += row_seq_count.get(row_seq, 0)return count

四、复杂度分析

4.1 三层循环

时间复杂度: O(n^3)。其中 n 为矩阵 grid 的行数或列数。

空间复杂度: O(1)。

4.2 哈希 + 二层循环

时间复杂度: O(n^2)。其中 n 为矩阵 grid 的行数或列数。

空间复杂度: O(n^2)。


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

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

相关文章

LeetCode74二分搜索优化:二维矩阵中的高效查找策略

题目描述 力扣地址 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&…

抖店和商品橱窗有什么区别?新手应该选哪个?

我是电商珠珠 临近年底了&#xff0c;有的人已经开始为下一年筹谋&#xff0c;有的去抖音做账号做直播带货&#xff0c;不会直播带货的就想尝试做下抖店&#xff0c;来为以后的经济打基础。 刚想要接触却对这类有些迷糊&#xff0c;发现商品橱窗和抖店都可以卖货&#xff0c;…

jumpServer-01-跳板机与堡垒机

jumpServer-01-跳板机与堡垒机 文章目录 jumpServer-01-跳板机与堡垒机一、为什么需要跳板机&#xff1f;二、堡垒机的核心价值三、跳板机与堡垒机的区别四、堡垒机的核心作用与价值 一、为什么需要跳板机&#xff1f; 跳板机&#xff08;Jump Server&#xff09;是一种安全设备…

C# WPF上位机开发(以始为终,寻找真实的上位机需求)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 c# wpf、qt、mfc这些上位机的需求是真实存在的&#xff0c;在现实中有很多应用的地方&#xff0c;这一点大家都很清楚。而程序员本身呢&#xff0c…

iOS问题记录 - iOS 17通过NSUserDefaults设置UserAgent无效(续)

文章目录 前言开发环境问题描述问题分析1. 准备源码2. 定位源码3. 对比源码4. 分析总结 解决方案补充内容1. UserAgent的组成2. UserAgent的设置优先级 最后 前言 在上篇文章中对该问题做了一些判断和猜测&#xff0c;并给出了解决方案。不过&#xff0c;美中不足的是没有进一…

117基于matlab的短时傅里叶变换(STFT)、小波变换(WT)、同步压缩变换(SST)、瞬态提取变换(TET)进行时频分析

基于matlab的短时傅里叶变换&#xff08;STFT&#xff09;、小波变换&#xff08;WT&#xff09;、同步压缩变换&#xff08;SST&#xff09;、瞬态提取变换&#xff08;TET&#xff09;进行时频分析。程序已调通&#xff0c;可直接运行。 117时频分析短时傅里叶变换 (xiaohong…

酷开系统 | 重磅!酷开科技荣获第十届广东专利优秀奖!

2023年12月16日广东省市场监督管理局公布了第十届广东专利奖获奖名单并进行了公示。其中&#xff0c;深圳市酷开网络科技股份有限公司申报的专利“一种智能电视的交互系统及方法”&#xff08;专利号ZL201310038386.0&#xff09;&#xff0c;荣获第十届广东专利优秀奖。 广东…

CSS 纵向底部往上动画

<template><div class"container" mouseenter"startAnimation" mouseleave"stopAnimation"><!-- 旋方块 --><div class"box" :class"{ scale-up-ver-bottom: isAnimating }"><!-- 元素内容 --&g…

【图像拼接】源码精读:Seam-guided local alignment and stitching for large parallax images

第一次来请先看这篇文章&#xff1a;【图像拼接&#xff08;Image Stitching&#xff09;】关于【图像拼接论文源码精读】专栏的相关说明&#xff0c;包含专栏内文章结构说明、源码阅读顺序、培养代码能力、如何创新等&#xff08;不定期更新&#xff09; 【图像拼接论文源码精…

在Adobe Acrobat上如何做PDF文档签名

Adobe Acrobat如何做PDF文档签名&#xff1f;PDF文档签名是指对PDF文档进行基于证书的数字签名&#xff0c;类似于传统的手写签名&#xff0c;可标识签名文档的人员。与手写签名不同&#xff0c;数字签名难以伪造&#xff0c;因为其包含签名者唯一的加密信息。为PDF文档进行基于…

网络四元组

文章目录 网络四元组 今天我们来聊聊 网络四元组 网络四元组 四元组&#xff0c;简单理解就是在 TCP 协议中&#xff0c;去确定一个客户端连接的组成要素&#xff0c;它包括源 IP 地址、目标 IP 地址、源端口号、目标端口号。 正常情况下&#xff0c;我们对于网络通信的认识可…

【C++】Ubuntu编译filezilla client

在新版Ubuntu 22.04.3 LTS上编译filezilla client成功&#xff0c;shell命令如下&#xff1a; sudo apt-get install libfilezilla-dev libwxbase3.0-dev gnutls-dev libdbus-1-dev sudo apt-get install libwxgtk3.0-gtk3-dev sudo apt-get install libgtk-3-dev sudo apt-ge…

华为云默认安全组配置规则说明

华为云服务器默认安全组可选Sys-default、Sys-WebServer或Sys-FullAccess。default是默认安全组规则&#xff0c;只开放了22和3389端口&#xff1b;Sys-WebServer适用于Web网站开发场景&#xff0c;开放了80和443端口&#xff1b;Sys-FullAccess开放了全部端口。阿腾云atengyun…

Python数据科学应用从入门到精通--Python读取、合并SPSS数据文件

在很多情况下&#xff0c;我们需要调用SPSS软件产生的数据&#xff0c;下面通过示例来进行讲解。首先需要将本书提供的数据文件存储在安装spyder-py3的默认路径位置&#xff08;C:/Users/Administrator/.spyder-py3/&#xff0c;注意具体的安装路径可能与此不同&#xff09;&am…

IOS - 手机安装包 ipa 常见几种方式

安装 ipa 包的方法有很多中&#xff0c;可以通过不同的软件安装&#xff0c;本文只列出了常用的几种&#xff0c;做个简单的归纳整理 1、iTunes 安装 数据线连接手机之后&#xff0c;会自动连接iTunes&#xff0c;&#xff08;第一次连接的时候会提示是否信任此电脑&#xff0…

m1芯片电脑上的paragon15如何安装激活 m1芯片电脑上ntfs for mac如何安装

Paragon NTFS软件在M1芯片电脑上安装之后&#xff0c;最后一步会让我们“允许加载第三方内核扩展”&#xff0c;具体如下图所示。 图1&#xff1a;允许加载第三方内核扩展 按照图中提示“单击此处“&#xff0c;然后打开安全与隐私。接下来依次点击小锁标志进行解锁&#xff0c…

目标检测-One Stage-YOLOv1

文章目录 前言一、YOLOv1的网络结构和流程二、YOLOv1的损失函数三、YOLOv1的创新点总结 前言 前文目标检测-Two Stage-Mask RCNN提到了Two Stage算法的局限性&#xff1a; 速度上并不能满足实时的要求 因此出现了新的One Stage算法簇&#xff0c;YOLOv1是目标检测中One Stag…

对Web3.0概念的梳理

文章目录 前言对Web3.0的畅想Web1.0和Web2.0对协议的进一步分析比特币的启发Web3.0的特点结语引用 前言 随着Bitcoin的天启事件&#xff08;参见&#xff1a;《比特币白皮书》&#xff09;&#xff0c;近年来技术领域涌现出一大批新名词。这些名词的意义以及它们之间的关联&am…

undefined reference to `pthread_create‘的另外一种解法

背景 编译带有thread的程序人&#xff0c;如果忘记-lpthread&#xff0c;那么就会报错 解决办法一&#xff1a;添加-lpthread 很简单添加-lpthread就行了 解决办法二&#xff1a;升级glibc 在高版本的glibc上&#xff0c;可能无需增加-lpthread Why glibc 2.34 removed li…

传统跨境电商是否应转型独立站?

在疫情和逆全球化浪潮的冲击下&#xff0c;跨境电商成为外贸新动能。2022年我国跨境电商进出口总额突破2万亿&#xff0c;助力外贸稳定规模、优化结构。作为外贸发展的新引擎&#xff0c;跨境电商不仅巩固外循环&#xff0c;更是拉动双循环新发展格局的重要力量。在跨境电商蓬勃…