码迷,mamicode.com
首页 > 其他好文 > 详细

矩阵的之字型遍历

时间:2016-06-12 03:16:42      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:给你一个包含 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


矩阵的之字型遍历

标签:

原文地址:http://blog.csdn.net/guoziqing506/article/details/51602261

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!