Python 编写一个程序打印给定2D矩阵的对角元素

Python 编写一个程序打印给定2D矩阵的对角元素

在本教程中,我们将编写Python程序来打印给定矩阵的对角元素。这是一个常见的技术面试问题。

给定一个2D矩阵;我们需要打印主对角线和次对角线。

输入:

1 2 3 4
4 3 2 1
7 8 9 6
6 5 4 3

输出:

Primary Diagonal: 1, 3, 9, 3
Secondary Diagonal: 4, 2, 8, 6

输入:

2 2 2
2 2 2
2 2 2

输出:

Primary Diagonal: 2, 2, 2
Secondary Diagonal: 2, 2, 2

让我们来了解Python中矩阵的行列模式。

Mat00 Mat 01 Mat 02 Mat 03
Mat 10 Mat 11 Mat 12 Mat 13
Mat 20 Mat 21 Mat 22 Mat 23
Mat 30 Mat 31 Mat 32 Mat 33
  • 要获取主对角线元素,我们需要找到Mat00、Mat11、Mat22和Mat33;它是通过使用相同的行和列名称来形成的。
The row-column condition is row = column.
  • 要获取主对角线元素,我们需要找到Mat03,Mat12,Mat21,Mat30;次对角线的条件是 –
The row-column condition is row = numberOfRows - column -1.

什么是矩阵

矩阵是一个二维结构,将数据按行和列存储。它可以存储整数、字符串、表达式、特殊符号等等。

矩阵是行和列的集合,它的结构用RXC表示,其中R表示行数,C表示矩阵的列数。

在Python中,我们可以使用两种方法来创建矩阵-使用列表和Numpy库。

以下代码表示3×3数字矩阵。

示例

mat = [['a', 'b', 'c'],
      ['d', 'e', 'f'],
      ['g', 'h', 'i']]

print (mat)

输出

[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]

Python中的矩阵表示

请记住,我们总是先写行号,然后是列号。矩阵中元素X的正确格式为X(R,C),其中R和C表示元素所在的行和列。

让我们看看以下数字的3×3和2×2矩阵,Z表示一个2×3的字符串矩阵。

示例

X = [['a', 'b', 'c'],
      ['d', 'e', 'f'],
      ['g', 'h', 'i']]
Y = [[12, 14],
      [60, 80]]
Z = [[1, 2, 3],
      [4, 5, 6]]
print(X)
print(Y)
print(Z)

输出:

[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
[[27, 34], [61, 18]]
[['one', 'two', 'three'], ['four', 'five', 'six']]

现在我们对Python中矩阵表示的基本概念有了一定的了解。现在让我们来看解决方案部分。

解决方案

我们先来了解第一种方法。

方法 – 1:

在这种方法中,我们将使用两个循环来遍历列,一个循环来遍历行,在内部循环中,我们检查条件。

示例

def diagonalMat(mat):      
    print("Primary Diagonal is: ", end = "")
    row = len(mat)
    col = len(mat[0])

    for i in range(row):
        for j in range(col):
            if i==j:
                print(mat[i][j], end = ',')

    print()


mat = [[1, 2, 3, 4],
          [4, 3, 2, 1],
          [7, 8, 9, 6],
          [6, 5, 4, 3]]          
diagonalMat(mat)

输出:

Primary Diagonal is: 1,3,9,3,

说明 –

在上面的代码中,我们获得了矩阵的行和列,并使用了两个for循环。在内部循环中,我们检查条件,如果i和j相等,则打印相应的元素。

现在我们将编写程序以获得次对角线

示例2:

def SecondaryDiagonal(mat, n):
    print("Secondary Diagonal: ", end = "")

    for i in range(n):
        for j in range(n):

            # Condition for secondary diagonal
            if ((i + j) == (n - 1)):
                print(mat[i][j], end = ", ")
    print()
mat = [[1, 2, 3, 4],
          [4, 3, 2, 1],
          [7, 8, 9, 6],
          [6, 5, 4, 3]]
n = 4
SecondaryDiagonal(mat, n)

输出:

Secondary Diagonal: 4, 2, 8, 6,

时间复杂度 – O(n 2 )

由于涉及嵌套循环,因此时间复杂度为平方级别。

辅助空间: O(1)。

由于不占用额外的空间

方法 – 2:

我们可以使用单个for循环解决这个问题。让我们理解以下示例。

示例

def displayPrincipalDiagonal(mat):
    print("Principal Diagonal: ", end = "")
    n = len(mat)
    for i in range(n):

        # Printing principal diagonal
        print(mat[i][i], end = ", ")

    print()
mat = [ [ 1, 2, 3, 4 ],
      [ 5, 6, 7, 8 ],
      [ 1, 2, 3, 4 ],
      [ 5, 6, 7, 8 ] ]
displayPrincipalDiagonal(mat)

输出:

Principal Diagonal: 1, 6, 3, 8,

解释-

在上面的代码中,我们使用一个for循环来遍历n*n的矩阵,并打印出索引变量i对应的 mat[i][i]。

对于次对角线元素,

示例2:

def displaySecondaryDiagonal(mat):

    print("Secondary Diagonal: ", end = "")
    n = len(mat)
    k = n - 1

    for i in range(n):

        # Secondary secondary diagonal
        print(mat[i][k], end = ", ")
        k -= 1

    print()
mat = [ [ 1, 2, 3, 4 ],
      [ 5, 6, 7, 8 ],
      [ 1, 2, 3, 4 ], 
      [1, 7, 6, 2]]
displaySecondaryDiagonal(mat)

输出:

Secondary Diagonal: 4, 7, 2, 1,

解释 –

我们使用了与上面相同的方法,并打印mat [i] [k],其中i是索引变量,k = matrix_length – 1,并且将k减少到i & lt; n。

复杂度分析

  • Time Complexity: O (n)。由于涉及嵌套循环,时间复杂度是平方的。
  • Auxiliary Space: O (1)。没有占用额外空间。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程