题目描述:给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历。
样例:对于如下矩阵:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10, 11, 12]
]
返回 [1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12]
首先,先说明一下题目的意思。其实是以45度角方向遍历整个矩阵,斜向上,斜向下交替进行。拿样例来说,如下图所示:
箭头表示的就是遍历的顺序。
所以,我们可以设计一个布尔值up表示现在应该向上还是向下,但是这个程序的难点在于up的转换。
一开始的时候,up = True,向上走,什么时候改变方向呢?
为了方便说明,我们设行标号为i, 列标号为j:
1. 当 i < 0 或者 j >= n 时,改变方向朝下走。但是标号还需调整,若 j < n ,表示可以往右走,那么 j 不变,令i = i - 1(行归位);若 j >= n (不能往右走),j = j - 1(列归位),i = i - 2(向下移动一位,比如样例中从8到12)
2. 当 i >= m 或者j < 0,改变方向朝上走,同理,调整标号(这道题的难点就在于标号的调整,要分析仔细了)
搞明白原理,就可以给出代码:
class Solution: # @param: a matrix of integers # @return: a list of integers def printZMatrix(self, matrix): result, count = [], 0 if len(matrix) == 0: return result m, n = len(matrix), len(matrix[0]) i, j = 0, 0 while count < m * n: up = True while up == True and i >= 0 and j < n: result.append(matrix[i][j]) i -= 1 j += 1 count += 1 # 可以往右走 if j <= n - 1: i += 1 # 不能往右,就只能往下走 else: i += 2 j -= 1 up = False while up == False and i < m and j >= 0: result.append(matrix[i][j]) i += 1 j -= 1 count += 1 # 可以往下走 if i <= m - 1: j += 1 # 不能往下走,就只能往右 else: j += 2 i -= 1 return result # write your code here
时间: 2024-10-06 16:40:56