返回
29. 顺时针打印矩阵:清晰易懂的 Swift 解法
IOS
2024-02-15 22:03:50
引言
「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 解法。通过分解算法步骤并提供清晰的示例代码,我们旨在让算法更容易理解和实现。掌握了这种解法,你将为解决类似的算法问题打下坚实的基础。