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

其他系列文章导航

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,一经查实,立即删除!

相关文章

189.【2023年华为OD机试真题(C卷)】单行道汽车通行时间(模拟题—JavaPythonC++JS实现)

请到本专栏顶置查阅最新的华为OD机试宝典 点击跳转到本专栏-算法之翼:华为OD机试 🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,深度掌握! 文章目录 189.【2023年华为OD机试真题(C卷)】单行道汽车通行时…

基于STM32+QT设计的无人超市消费系统_139

基于STM32+QT设计的无人超市消费系统 一、前言 1.1 研究背景 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。 超市形式在我国于20世纪90年代初期起步,现已成为我国零售业的一种重要形态…

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;美中不足的是没有进一…

ELF Strip

在计算机领域&#xff0c;"ELF strip"通常指的是从可执行和共享目标文件中删除符号表和调试信息的操作。 ELF&#xff08;Executable and Linkable Format&#xff09;是一种常见的二进制文件格式&#xff0c;用于可执行文件、共享库和目标文件。ELF文件包含了程序的…

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…

cjson/cJSON.h: No such file or directory

具体错误 In file included from mosquitto_ctrl.c:19: ../../config.h:86:12: fatal error: cjson/cJSON.h: No such file or directory86 | # include <cjson/cJSON.h>| ^~~~~~~~~~~~~~~解决办法1&#xff08;无效&#xff09; sudo apt install -y libj…

Lumerical------FDE mesh settings

Lumerical------FDE mesh settings 推荐阅读正文重写 Mesh 仿真区域,不设置 FDE Solver Mesh 区域的结果去掉重写 Mesh 仿真区域,仅设置 FDE Solver Mesh 区域的结果重写 Mesh 仿真区域,,同时设置 FDE Solver Mesh 区域的结果推荐阅读 Lumerical------FDE Example—Si Wav…

【图像拼接】源码精读: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…

K8S学习指南(54)-K8S核心组件API-Server简介

文章目录 引言API Server 架构设计1. 组件关系2. 多层设计 API Server 主要功能1. 提供 RESTful API2. 认证与授权示例&#xff1a;使用 kubectl 进行身份验证 3. Admission Control示例&#xff1a;禁止创建特定标签的 Pod 4. 业务逻辑处理示例&#xff1a;使用 kubectl 创建一…

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

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

成功解决Java.lang.OutOfMemoryError: GC overhead limit exceeded错误

成功解决Java.lang.OutOfMemoryError: GC overhead limit exceeded错误 本文目录 一、问题分析 二、报错原因 三、解决思路 四、解决方法 总结 一、问题分析 在实际的Java开发中&#xff0c;我们可能会遇到一个很常见的报错&#xff1a;“java.lang.OutOfMemoryError: G…