leetcode
leetcode 1851 ~ 1900
检查是否每一行每一列都包含全部整数

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

难度:

标签:

题目描述

对一个大小为 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

代码结果

运行时间: 35 ms, 内存: 16.7 MB


/* 
 思路:
 使用Java Stream来验证矩阵的每一行和每一列是否包含1到n的所有数字。我们可以通过对每一行和每一列进行排序,然后与期望的排序后的数组进行比较,如果相等,则说明该行或列包含所有数字,否则返回false。 
*/
import java.util.Arrays;
import java.util.stream.Collectors;

public class Solution {
    public boolean isValidMatrix(int[][] matrix) {
        int n = matrix.length;
        int[] expected = new int[n];
        for (int i = 0; i < n; i++) expected[i] = i + 1;

        for (int i = 0; i < n; i++) {
            int[] row = Arrays.stream(matrix[i]).sorted().toArray();
            if (!Arrays.equals(row, expected)) return false;

            int[] col = Arrays.stream(Arrays.stream(matrix).mapToInt(r -> r[i]).toArray()).sorted().toArray();
            if (!Arrays.equals(col, expected)) return false;
        }
        return true;
    }
}

解释

方法:

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

时间复杂度:

O(n^2)

空间复杂度:

O(n)

代码细节讲解

🦆
在解法中,为什么将每一行或每一列转换为集合时能够确保没有重复元素?
在Python中,集合(Set)是一个不包含重复元素的数据结构。当你将一个列表转换为集合时,任何重复的元素都会被自动移除,保留一个唯一实例。因此,当每一行或每一列的列表被转换为集合后,如果原列表中包含重复的数值,转换成集合后这些重复元素会被合并成一个元素,导致集合的大小小于原列表的长度。这是我们用来检测重复元素的依据。
🦆
如何理解并解释代码中`zip(*matrix)`这一部分的功能和作用?
`zip(*matrix)`是Python中的一种用法,利用了解包和zip函数的特性。在这里,`*matrix`将矩阵解包为若干个列表(即矩阵的行),然后`zip`函数将这些列表的对应元素组合成新的元组,实际上是将矩阵的行转换为列。例如,矩阵的第一个元组包含所有行的第一个元素,即第一列的所有元素。这样,`zip(*matrix)`就能有效地提取出矩阵的所有列,便于进行列的检查。
🦆
如果矩阵中包含了负数或者超过n的数值,当前的代码是否能够正确处理并返回False?
当前的代码只检查了每行和每列转换为集合后的大小是否为n,但没有检查集合中具体的元素是否确切地为1到n的整数。如果矩阵中包含负数或超过n的数值,只要每行和每列的不重复元素个数仍然是n,代码依旧会返回True。因此,这是代码的一个漏洞,它不能正确处理包含无效元素(如负数或超范围的数值)的情况。
🦆
考虑到每一行和每一列都必须恰好包含从1到n的整数,为什么检查集合的大小等于n就足够了?是否需要检查集合中具体包含的元素?
虽然检查集合的大小等于n是确保没有重复元素的必要条件,但这并不是充分条件。为了确保矩阵的有效性,我们还需要确认集合中确实包含了从1到n的所有整数。如果不进行这一步骤,例如集合中包含了负数或超过n的数值,那么仅仅检查大小等于n是不足以验证矩阵的有效性的。因此,确实需要检查集合中具体包含的元素是否完全是从1到n的整数。

相关问题