思路分析
- 统计每行的出现次数:将每行数组转换为「可哈希的键」(如字符串 / 列表),用哈希表记录每行出现的次数;
- 遍历每列匹配行:将每列数组转换为相同格式的键,去哈希表中查询该键的出现次数,累加所有匹配次数即为答案。
代码实现
java
public int equalPairs(int[][] grid){
int result = 0;
Map<List<Integer>, Integer> map = new HashMap<>();
// 保存所有的行
for (int i = 0; i < grid.length; i++) {
List<Integer> list = new ArrayList<>();
for (int num = 0; num < grid[i].length; num++) {
list.add(grid[i][num]);
}
map.put(list, map.getOrDefault(list, 0) + 1);
}
// 遍历所有的列
for (int col = 0; col < grid[0].length; col++) {
List<Integer> list = new ArrayList<>();
for (int j = 0; j < grid.length; j++) {
list.add(grid[j][col]);
}
result += map.getOrDefault(list, 0);
}
return result;
}
复杂度分析
- 整体时间复杂度:O(n2)(最优,无法低于此复杂度,因为必须遍历所有行列元素);
- 空间复杂度:O(n2)(最坏情况所有行都不同,哈希表存储 n 个长度为 n 的行)。