返回

29. 顺时针打印矩阵:清晰易懂的 Swift 解法

IOS

引言

「29. 顺时针打印矩阵」是算法面试中常见的问题之一。给定一个二维矩阵,要求按照从外向里的顺序,顺时针打印出矩阵中的每个元素。这个问题看似简单,但实现起来却需要巧妙的算法设计和对数据结构的熟练掌握。

可读性最强的 Swift 解法

我们提供了一种可读性极佳的 Swift 解法,该解法将算法的各个步骤拆解为清晰易懂的子任务:

1. 定义矩阵边界

首先,我们需要确定矩阵的边界,即矩阵的左、上、右、下四个边界的坐标。这些边界将用于控制打印的范围。

var left = 0, right = matrix[0].count - 1
var top = 0, bottom = matrix.count - 1

2. 顺时针打印矩阵

接下来,我们进入矩阵的顺时针打印循环。我们将按照左、上、右、下的顺序,逐层打印矩阵中的元素,直到所有元素都被打印出来。

while left <= right && top <= bottom {
    // 左侧边界
    for i in left...right {
        print(matrix[top][i])
    }
    // 上侧边界
    for i in top + 1...bottom {
        print(matrix[i][right])
    }
    // 右侧边界(从下往上打印)
    if top != bottom {
        for i in stride(from: right, through: left, by: -1) {
            print(matrix[bottom][i])
        }
    }
    // 下侧边界(从右往左打印)
    if left != right {
        for i in stride(from: bottom - 1, through: top + 1, by: -1) {
            print(matrix[i][left])
        }
    }
    
    // 更新边界,向内缩进一层
    left += 1
    top += 1
    right -= 1
    bottom -= 1
}

算法分析

该算法的时间复杂度为 O(m x n),其中 m 和 n 分别为矩阵的行数和列数。因为算法逐层打印矩阵,所以需要访问矩阵中的每个元素一次。

空间复杂度为 O(1),因为算法不需要使用额外的空间来存储中间结果。

示例

let matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
printMatrix(matrix) // 输出:1 2 3 6 9 8 7 4 5

总结

本文介绍了「29. 顺时针打印矩阵」问题的可读性最强的 Swift 解法。通过分解算法步骤并提供清晰的示例代码,我们旨在让算法更容易理解和实现。掌握了这种解法,你将为解决类似的算法问题打下坚实的基础。