2352. 相等行列对
2352. 相等行列对
🟠 🔖 数组
哈希表
矩阵
模拟
🔗 力扣
LeetCode
题目
Given a 0-indexed n x n
integer matrix grid
, return the number of pairs(ri, cj)
such that rowri
and columncj
are equal.
A row and column pair is considered equal if they contain the same elements in the same order (i.e., an equal array).
Example 1:
Input: grid = [[3,2,1],[1,7,6],[2,7,7]]
Output: 1
Explanation: There is 1 equal row and column pair:
- (Row 2, Column 1): [2,7,7]
Example 2:
Input: grid = [[3,1,2,2],[1,4,4,5],[2,4,2,2],[2,4,2,2]]
Output: 3
Explanation: There are 3 equal row and column pairs:
- (Row 0, Column 0): [3,1,2,2]
- (Row 2, Column 2): [2,4,2,2]
- (Row 3, Column 2): [2,4,2,2]
Constraints:
n == grid.length == grid[i].length
1 <= n <= 200
1 <= grid[i][j] <= 10^5
题目大意
给你一个下标从 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] <= 10^5
解题思路
初始化变量:
- 获取矩阵的行数和列数
n
。 - 创建一个哈希表
rows
来存储行的字符串表示的出现次数。 - 创建一个数组
cols
用于构建列的字符串表示。
- 获取矩阵的行数和列数
统计行的出现次数:
- 遍历每一行,将每一行的元素拼接成字符串
rowStr
(以逗号分隔)。 - 将这个字符串作为键存入哈希表
rows
,并记录其出现次数。 - 同时,将每一行的元素拼接到对应的列字符串
cols[j]
中,构建列的字符串表示。
- 遍历每一行,将每一行的元素拼接成字符串
统计行列对的数量:
- 初始化结果
res
为 0。 - 遍历构建的列字符串
cols
,对每个列字符串,在哈希表中查找其出现次数。 - 将出现次数累加到结果
res
中。
- 初始化结果
返回结果:
- 返回最终的结果
res
,即满足条件的行列对的数量。
- 返回最终的结果
复杂度分析
- 时间复杂度:
O(n^2)
,因为需要遍历整个grid
矩阵一次,构建行和列字符串。 - 空间复杂度:
O(n)
,哈希表rows
和数组cols
存储了行和列的字符串表示。
代码
/**
* @param {number[][]} grid
* @return {number}
*/
var equalPairs = function (grid) {
const n = grid.length;
// 存储行的字符串表示
let rows = new Map();
// 存储列的字符串表示
let cols = new Array(n).fill('');
// 构建并统计行字符串和列字符串
for (let i = 0; i < n; i++) {
let rowStr = '';
for (let j = 0; j < n; j++) {
rowStr += grid[i][j] + ',';
cols[j] += grid[i][j] + ',';
}
rows.set(rowStr, (rows.get(rowStr) || 0) + 1);
}
let res = 0;
// 统计满足条件的行列对数量
for (let colStr of cols) {
res += rows.get(colStr) || 0;
}
return res;
};
相关题目
题号 | 标题 | 题解 | 标签 | 难度 | 力扣 |
---|---|---|---|---|---|
2500 | 删除每行中的最大值 | 数组 矩阵 排序 2+ | 🟢 | 🀄️ 🔗 |