检查是否每一行每一列都包含全部整数

标签: 数组 哈希表 矩阵

难度: Easy

对一个大小为 n x n 的矩阵而言,如果其每一行和每一列都包含从 1n全部 整数(含 1n),则认为该矩阵是一个 有效 矩阵。

给你一个大小为 n x n 的整数矩阵 matrix ,请你判断矩阵是否为一个有效矩阵:如果是,返回 true ;否则,返回 false

示例 1:

输入:matrix = [[1,2,3],[3,1,2],[2,3,1]]
输出:true
解释:在此例中,n = 3 ,每一行和每一列都包含数字 1、2、3 。
因此,返回 true 。

示例 2:

输入:matrix = [[1,1,1],[1,2,3],[1,2,3]]
输出:false
解释:在此例中,n = 3 ,但第一行和第一列不包含数字 2 和 3 。
因此,返回 false 。

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 100
  • 1 <= matrix[i][j] <= n

Submission

运行时间: 35 ms

内存: 16.7 MB

class Solution:
    def checkValid(self, matrix: List[List[int]]) -> bool:
        n = len(matrix)
        for row, col in zip(matrix, zip(*matrix)):
            if len(set(row)) != n or len(set(col)) != n:
                return False
        return True

Explain

这个题解利用了集合(Set)来验证每一行和每一列是否包含了从1到n的所有整数。首先,它获取了矩阵的尺寸n。然后,通过遍历矩阵的每一行和每一列(zip(*matrix)用于获取列),检查每一行和每一列转化为集合后的大小是否都是n。如果某一行或某一列的集合大小不是n,说明其中包含重复元素或者缺失元素,因此矩阵不是有效的,返回False。如果所有行和列检查通过,则返回True。

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

空间复杂度: O(n)

class Solution:
    def checkValid(self, matrix: List[List[int]]) -> bool:
        n = len(matrix)  # 获取矩阵的尺寸
        # 同时遍历矩阵的行和列
        for row, col in zip(matrix, zip(*matrix)):
            # 将行和列转换为集合,并检查是否包含了从1到n的所有整数
            if len(set(row)) != n or len(set(col)) != n:
                return False  # 如果不符合条件,返回False
        return True  # 所有行和列都符合条件,返回True

Explore

在Python中,集合(Set)是一个不包含重复元素的数据结构。当你将一个列表转换为集合时,任何重复的元素都会被自动移除,保留一个唯一实例。因此,当每一行或每一列的列表被转换为集合后,如果原列表中包含重复的数值,转换成集合后这些重复元素会被合并成一个元素,导致集合的大小小于原列表的长度。这是我们用来检测重复元素的依据。

`zip(*matrix)`是Python中的一种用法,利用了解包和zip函数的特性。在这里,`*matrix`将矩阵解包为若干个列表(即矩阵的行),然后`zip`函数将这些列表的对应元素组合成新的元组,实际上是将矩阵的行转换为列。例如,矩阵的第一个元组包含所有行的第一个元素,即第一列的所有元素。这样,`zip(*matrix)`就能有效地提取出矩阵的所有列,便于进行列的检查。

当前的代码只检查了每行和每列转换为集合后的大小是否为n,但没有检查集合中具体的元素是否确切地为1到n的整数。如果矩阵中包含负数或超过n的数值,只要每行和每列的不重复元素个数仍然是n,代码依旧会返回True。因此,这是代码的一个漏洞,它不能正确处理包含无效元素(如负数或超范围的数值)的情况。

虽然检查集合的大小等于n是确保没有重复元素的必要条件,但这并不是充分条件。为了确保矩阵的有效性,我们还需要确认集合中确实包含了从1到n的所有整数。如果不进行这一步骤,例如集合中包含了负数或超过n的数值,那么仅仅检查大小等于n是不足以验证矩阵的有效性的。因此,确实需要检查集合中具体包含的元素是否完全是从1到n的整数。