相等行列对

标签: 数组 哈希表 矩阵 模拟

难度: Medium

给你一个下标从 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

Submission

运行时间: 51 ms

内存: 20.4 MB

class Solution:
    def equalPairs(self, grid: List[List[int]]) -> int:
        a=[]
        b=[]
        c=0
        m=len(grid)
        n=len(grid[0])
        for row in grid:
            a.append(tuple(row))
        a1=collections.Counter(a)
        for col in zip(*grid):
            if a1[col] is not None:
                c=c+a1[col]
        return c

Explain

该题解首先将矩阵的每一行转换为元组并存储在列表a中。使用collections.Counter计算列表a中每种元组出现的次数,存储在a1中。然后,它遍历矩阵的每一列(通过对grid使用zip(*)来获得列),并检查每个列元组在a1中的出现次数。如果该列元组存在于a1中,则将其计数加到总数c中。最终,返回总数c,即相等的行列对的数量。

时间复杂度: O(n^2)

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

# 定义一个Solution类
class Solution:
    def equalPairs(self, grid: List[List[int]]) -> int:
        a = []  # 用来存储矩阵中每一行的元组
        b = []  # 这个列表未被使用,可以移除
        c = 0  # 初始化相等行列对的计数器
        m = len(grid)  # 矩阵的行数
        n = len(grid[0])  # 矩阵的列数
        # 将每一行转换为元组并存储到a中
        for row in grid:
            a.append(tuple(row))
        # 使用Counter计算每个元组在a中的出现频率
        a1 = collections.Counter(a)
        # 遍历矩阵的每一列
        for col in zip(*grid):
            # 如果列元组在a1中,则增加计数器c
            if a1[col]:
                c += a1[col]
        return c

Explore

在Python中,元组(tuple)是不可变的数据结构,而列表(list)是可变的。这种不可变性使得元组可以用作字典的键或集合的元素,这在需要唯一性和哈希性质时非常有用。在题解中,使用collections.Counter来统计每种行元组出现的次数,而Counter需要能够对其元素进行哈希操作。由于列表不能被哈希(因为它们是可变的),所以选择使用元组来代表每行的内容。此外,使用元组还可以在内部实现中提供比列表更好的性能优势,尤其是在空间使用和访问速度方面。

是的,变量`b`在代码中被声明但未被使用,这确实表示代码中存在冗余。移除未使用的变量不仅可以减少资源消耗(尽管在这种情况下影响微小),更重要的是可以提高代码的清晰度和可维护性。改进代码的一种方法是直接删除或注释掉变量`b`的声明行。这样,代码不仅看起来更加整洁,而且对于其他阅读或维护代码的开发者来说,理解代码的意图和结构也更为容易。