📌  相关文章
📜  给定矩阵左上角的第 K 条对角线(1)

📅  最后修改于: 2023-12-03 15:11:40.562000             🧑  作者: Mango

给定矩阵左上角的第K条对角线

介绍

在矩阵中,从左上角开始向右下方延伸的对角线被称为主对角线,第二个对角线是从主对角线右侧延伸的对角线,依此类推。给定一个矩阵,从左上角开始,第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()

如果一切正常,将不会有输出。