📅  最后修改于: 2023-12-03 15:28:38.441000             🧑  作者: Mango
这道题目是GATE CS 2019考试中的一道编程题,要求实现一个函数,判断一个矩阵是否是门(Gate)。
一个矩阵被视为门,当且仅当:
函数签名如下:
def is_gate(arr: List[List[int]]) -> bool:
pass
在判断一个矩阵是否为门时,我们需要先判断矩阵的前两行和后两行,以及前两列和后两列中是否只有一个 1。
接着,我们遍历矩阵中除去前两行/列和后两行/列的部分,每当遇到一个 1 时,就判断它周围是否有 4 个相邻的 1。
之所以只需要判断四个方向,是因为根据题目要求,每个 1 恰好有 4 个相邻的元素。
from typing import List
def is_gate(arr: List[List[int]]) -> bool:
# 判断前两行和后两行
if arr[0].count(1) != 1 or arr[-1].count(1) != 1:
return False
# 判断前两列和后两列
if not all([arr[i][0] == 1 and arr[i][-1] == 1 for i in range(len(arr))]):
return False
# 遍历除去前两行/列和后两列/列的部分
for i in range(2, len(arr) - 2):
for j in range(2, len(arr[0]) - 2):
if arr[i][j] == 1:
adjacent_ones = [arr[i-1][j], arr[i+1][j], arr[i][j-1], arr[i][j+1]]
if adjacent_ones.count(1) != 4:
return False
return True
时间复杂度:$O(mn)$,其中 $m$ 表示矩阵的行数、$n$ 表示矩阵的列数。因为我们需要遍历除去前两行/列和后两行/列的部分。
空间复杂度:$O(1)$,因为我们没有使用额外的空间。