📅  最后修改于: 2023-12-03 15:11:40.562000             🧑  作者: Mango
在矩阵中,从左上角开始向右下方延伸的对角线被称为主对角线,第二个对角线是从主对角线右侧延伸的对角线,依此类推。给定一个矩阵,从左上角开始,第K条对角线是在主对角线的左侧第K个对角线。
例如,下面的矩阵中,第0条对角线包含16,第1条对角线包含12和7,第2条对角线包含3和2。
16 12 6 2
11 7 3 -1
6 2 0 3
1 -1 3 1
给定一个矩阵和整数K,编写一个函数,返回左上角的第K条对角线的元素。
函数签名如下:
def find_diagonal(matrix: List[List[int]], k: int) -> List[int]:
pass
输入:
matrix = [
[16,12, 6, 2],
[11, 7, 3,-1],
[ 6, 2, 0, 3],
[ 1,-1, 3, 1]
]
k = 1
输出:
[12, 7, 6]
我们可以从矩阵的第一行和第一列开始,像蛇一样遍历矩阵。如果我们在蛇的一个点上,该点是在第K条对角线上当且仅当行列坐标之和等于K。
例如,对于上述示例中的矩阵,我们可以按以下顺序遍历:
[16] [12 11] [6 7 6] [2 3 2 -1] [3 0 1] [-1 3] [1]
在遍历过程中,我们可以将矩阵的一列存储在一个数组中,然后将该数组与结果数组相连。如果数组有n个元素,主对角线是第0条对角线,第1条对角线是从主对角线左侧延伸的对角线,因此,我们将存储第i列的数组的前n-i个元素倒序排列,并将它们添加到结果数组中。
例如,在上述示例中,存储第1列的数组是[16, 11, 6, 1],因此,当我们处理第1条对角线时,我们将该数组的前2个元素[11, 16]倒序排列,并将其添加到结果数组中。
以下是Python中的实现:
from typing import List
def find_diagonal(matrix: List[List[int]], k: int) -> List[int]:
rows, cols = len(matrix), len(matrix[0])
ans = []
for i in range(rows + cols - 1):
row_begin = max(0, i - cols + 1)
row_end = min(i, rows - 1)
col_begin = max(0, i - rows + 1)
col_end = min(i, cols - 1)
tmp = []
for j in range(row_begin, row_end + 1):
tmp.append(matrix[j][i - j])
if (i % 2 == 0):
ans.extend(tmp[::-1])
else:
ans.extend(tmp)
return ans[k: k+cols] if k < cols else []
我们使用以下示例测试:
def test():
matrix = [
[16,12, 6, 2],
[11, 7, 3,-1],
[ 6, 2, 0, 3],
[ 1,-1, 3, 1]
]
assert find_diagonal(matrix, 1) == [12, 7, 6]
assert find_diagonal(matrix, 10) == []
test()
如果一切正常,将不会有输出。