矩阵的之字型遍历

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

矩阵的之字型遍历的相关文章

lintcode 容易题:Matrix Zigzag Traversal 矩阵的之字型遍历

题目: 矩阵的之字型遍历 给你一个包含 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] 解题: 感觉很简单,就是没有搞出来,程序来源 ,这里是先右上走,我换成先横着走就是不对了,表示不理解.另外一种方法,表示也不理解. java程序: public class Solut

281. Zigzag Iterator z字型遍历

[抄题]: Given two 1d vectors, implement an iterator to return their elements alternately. Example: Input: v1 = [1,2] v2 = [3,4,5,6] Output: [1,3,2,4,5,6] Explanation: By calling next repeatedly until hasNext returns false,   the order of elements retur

算法:Z字型(Zigzag)编排

问题:给定 n 行和 m 列的二维数组矩阵.如图所示,以 ZIG-ZAG 方式打印此矩阵. 从对称的角度来看,通过反复施加滑行反射可以从简单的图案如线段产生规则的之字形. 主要思想:算法从(0, 0)位置开始水平向右遍历,当到达(0, 1)时沿着反对角线方向左下遍历(利用一个变量控制左下右上方向),内层循环一直遍历到碰到边缘时row++,方向改为右上,沿着反对角线碰到矩阵上边缘时col++,方向变为左下遍历,知道上半部分(包括反对角线遍历完):遍历完半个矩阵(可能是子方矩阵)后,根据当前 row

LeetCode 第6题 Z字型变换

LeetCode 第6题 Z字型变换 题目描述 将一个给定字符串根据给定的行数,以从上往下.从左到右进行?Z 字形排列. 比如输入字符串为 "LEETCODEASHARANG"?行数为 3 时,排列如下: L???C???A???R E?T?O?E?S?A?A?G E???D???H???N 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCARETOESAAGEDHN". 请你实现这个将字符串进行指定行数变换的函数: string conver

Android基础入门教程——8.3.15 Paint API之——Typeface(字型)

Android基础入门教程--8.3.15 Paint API之--Typeface(字型) 标签(空格分隔): Android基础入门教程 本节引言: 本节带来Paint API系列的最后一个API,Typeface(字型),由字义,我们大概可以猜到,这个 API是用来设置字体以及字体风格的,使用起来也非常的简单!下面我们来学习下Typeface的一些相关 的用法!官方API文档:Typeface~ 1.字体的可选风格 四个整型常量: BOLD:加粗 ITALIC:斜体 BOLD_ITALIC

Firemonkey TComboBox 下拉菜单字型修改方法 (D10)

在 FMX 下的 TComboBox 下拉菜单字型修改有二种方法: 使用 Style,需先设定好 Style 后,再指定预设项的 Style,方法如下: procedure TForm1.FormCreate(Sender: TObject); var i: Integer; begin ComboBox2.DropDownKind := TDropDownKind.Custom; Combobox2.ListBox.DefaultItemStyles.ItemStyle := 'listbox

【LeetCode-面试算法经典-Java实现】【006-ZigZag Conversion(Z字型转换)】

[006-ZigZag Conversion(Z字型转换)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility) P A

Firemonkey 控件设定字型属性及颜色

将控件 StyledSettings 的勾取消(如此才能自定样式及字型,如果勾选则依 Style 而定). 设定 TextSettings 里的 Font 属性.

[函數] Firemonkey Android 取得系统参数设定的字型大小

Android 系统参数设定内,可以设定字型大小: 可以透过下面代码来取得字型大小比例: function FontScale: Single; var Resources: JResources; Configuration: JConfiguration; begin Result := 1; if TAndroidHelper.Context <> nil then begin Resources := TAndroidHelper.Context.getResources; if Re