检查是否每一行每一列都包含全部整数
难度:
标签:
题目描述
对一个大小为 n x n
的矩阵而言,如果其每一行和每一列都包含从 1
到 n
的 全部 整数(含 1
和 n
),则认为该矩阵是一个 有效 矩阵。
给你一个大小为 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)
代码细节讲解
🦆
在解法中,为什么将每一行或每一列转换为集合时能够确保没有重复元素?
▷🦆
如何理解并解释代码中`zip(*matrix)`这一部分的功能和作用?
▷🦆
如果矩阵中包含了负数或者超过n的数值,当前的代码是否能够正确处理并返回False?
▷🦆
考虑到每一行和每一列都必须恰好包含从1到n的整数,为什么检查集合的大小等于n就足够了?是否需要检查集合中具体包含的元素?
▷