来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/equal-row-and-column-pairs
给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ,返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。
如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。
n == grid.length == grid[i].length
1 <= n <= 200
1 <= grid[i][j] <= 105
输入:grid = [[3,2,1],[1,7,6],[2,7,7]]
输出:1
解释:存在一对相等行列对:
- (第 2 行,第 1 列):[2,7,7]
输入: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]
方法一:拼接成字符串,然后比对
class Solution {
public int equalPairs(int[][] grid) {
int n = grid[0].length;
int m = grid.length;
// 横
String[] u = new String[n];
String[] v = new String[m];
for (int i = 0; i < n; i++) {
u[i] = grid[0][i] + "";
for (int j = 1; j < m; j++) {
u[i] += "-" + grid[j][i];
}
}
// 竖
for (int i = 0; i < m; i++) {
v[i] = grid[i][0] + "";
for (int j = 1; j < n; j++) {
v[i] += "-" + grid[i][j];
}
}
// 比对
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (u[i].equals(v[j]))
ans++;
}
}
return ans;
}
}
方法二:哈希,官方解法,原理和方法一差不多
class Solution {
public int equalPairs(int[][] grid) {
int n = grid.length;
Map<List<Integer>, Integer> cnt = new HashMap<List<Integer>, Integer>();
for (int[] row : grid) {
List<Integer> arr = new ArrayList<Integer>();
for (int num : row) {
arr.add(num);
}
cnt.put(arr, cnt.getOrDefault(arr, 0) + 1);
}
int res = 0;
for (int j = 0; j < n; j++) {
List<Integer> arr = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
arr.add(grid[i][j]);
}
if (cnt.containsKey(arr)) {
res += cnt.get(arr);
}
}
return res;
}
}