标签:
题目描述:给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历。
样例:对于如下矩阵:
[返回 [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
标签:
原文地址:http://blog.csdn.net/guoziqing506/article/details/51602261