【leetcode】NO.5976 5976. 检查是否每一行每一列都包含全部整数 (Python)

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

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

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

思路

  1. 先构造一个一维数组;
  2. 获取二维数组的行和列;
  3. 对行和列进行排序之后和一维升序数组进行比较;

这里重点是怎么获取列数组:

  • 首先不能使用类似二维数组下标的形式:
    结果不对,因为上面的写法等价于:

a[:][-1] = a[-1] 方括号的运算顺序先计算最近的,再计算远的,因此得不到一列,而只能得到最后一行;并不得到列;
获取二维数组的列的方法有:
😄 使用功能zip()函数
map(list, zip(*matrix))

zip(*) 将元素进行解包,之后返回的是元组 使用map函数进行list映射;

😄 第二种方法:
for j in range(cnt): b = [i[j] for i in matrix] if sorted(b)==seq:

内部循环遍历行数,外部循环遍历列数;内部循环会选择没一行的第j个组合成一个列表;

😒 排序的一种方法是sorted() ; 或者直接使用set() 这样会默认排好序,从小到大;

这里需要注意不要使用list.sort()
这里排序之后会改变原来列表的值,之后的操作都会发生改变
image
使用内置的sorted() 会创建一个变量副本,不会改变原来的值

代码:

** Python 版本**

class Solution:
    def checkValid(self, matrix: List[List[int]]) -> bool:
        # 创建一维
        cnt = len(matrix)
        ans = list(range(1, cnt+1))
        # ans = [i for i in range(cnt+1)]
        for i in matrix:
            if sorted(i) == ans:
            else:
                return False
        # 处理列
        v_m = map(list, zip(*matrix))
        for j in v_m:
            if sorted(j) == ans:
            else:
                return False
        return True

方法二:

class Solution:
    def checkValid(self, matrix: List[List[int]]) -> bool:
        cnt = len(matrix)
        ans = [i for i in range(1,cnt+1)]
        for i in matrix:
            if sorted(i)==ans:
                continue
            else:
                return False
        for j in range(cnt):
            b = [i[j] for i in matrix]
            if sorted(b)==ans:
                continue
            else:
                return False

        return True
        

posted @ 2022-01-09 17:06  jucw  阅读(55)  评论(0编辑  收藏  举报