LintCode #46. Matrix Zigzag Traversal (Easy)

class Solution {
public:
vector<int> printZMatrix(vector<vector<int> > &matrix) {
vector<int> v;
if (matrix.size() == 0) return v;
int m = matrix.size(), n = matrix[0].size(), cnt = m * n;
int i = 0, j = 0;
int d[][2] = {{ -1, 1 }, { 1, -1 }};
int dir = 0;
while (v.size() < cnt) {
while (i >= 0 && i < m && j >= 0 && j < n) {
v.push_back(matrix[i][j]);
i += d[dir][0];
j += d[dir][1];
}
i -= d[dir][0];
j -= d[dir][1];
if (dir == 0) {
if (j + 1 < n) ++j;
else ++i;
} else {
if (i + 1 < m) ++i;
else ++j;
}
dir = (dir + 1) % 2;
}
return v;
}
};

思路:

  • 斜着走的方向只有"右上"(dir=0)和"左下"(dir=1). 按"右上", "左下"的顺序交替走.
  • 当走到边界的时候, 要么"向右走一步", 要么"向下走一步".
    • 如果正在向"上"走, 优先"向走一步", 若不能则"向走一步".
    • 如果正在向"下"走, 优先"向走一步", 若不能则"向走一步".

时间复杂度: O(m*n)

空间复杂度: O(1)


参照这篇博文的思路.

class Solution {
public:
/**
* @param matrix: a matrix of integers
* @return: a vector of integers
*/
vector<int> printZMatrix(vector<vector<int> > &matrix) {
vector<int> v;
if (matrix.size() == 0) return v;
int m = matrix.size(), n = matrix[0].size();
int sum = 0, x = 0, dx = -1;
while (sum < m + n - 1) {
while (x >= 0 && x < m && sum - x >= 0 && sum - x < n) {
v.push_back(matrix[x][sum - x]);
x += dx;
}
x -= dx;
sum++;
if ((dx == -1 && sum - x >= n)
|| (dx == 1 && x < m - 1)) {
++x;
}
dx = -dx;
}
return v;
}
};

思路:

  • 观察下标规律.
(0, 0)
(0, 1), (1, 0)
(2, 0), (1, 1), (0, 2)
(0, 3), (1, 2), (2, 1)
(2, 2), (1, 3)
(2, 3)

可以看到各行xy坐标的和是常数, 且该和逐行递增.

  • 偶数行x递减, 奇数行x递增.
  • 原解法有个缺陷是"矩阵越细长, 空循环就越多". 我的解法对这点进行了优化.

    时间复杂度: O(m*n)

    空间复杂度: O(1)

[OJ] Matrix Zigzag Traversal的更多相关文章

  1. Matrix Zigzag Traversal(LintCode)

    Matrix Zigzag Traversal Given a matrix of m x n elements (m rows, ncolumns), return all elements of ...

  2. Lintcode: Matrix Zigzag Traversal

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in ZigZag-or ...

  3. lintcode:Matrix Zigzag Traversal 矩阵的之字型遍历

    题目: 矩阵的之字型遍历 给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历. 样例 对于如下矩阵: [ [1, 2, 3, 4], [5, 6, 7, 8], [9 ...

  4. LeetCode OJ:ZigZag Conversion(字符串的Z字型转换)

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  5. [LintCode]——目录

    Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...

  6. Java Algorithm Problems

    Java Algorithm Problems 程序员的一天 从开始这个Github已经有将近两年时间, 很高兴这个repo可以帮到有需要的人. 我一直认为, 知识本身是无价的, 因此每逢闲暇, 我就 ...

  7. 别再埋头刷LeetCode之:北美算法面试的题目分类,按类型和规律刷题,事半功倍

    算法面试过程中,题目类型多,数量大.大家都不可避免的会在LeetCode上进行训练.但问题是,题目杂,而且已经超过1300道题. 全部刷完且掌握,不是一件容易的事情.那我们应该怎么办呢?找规律,总结才 ...

  8. PAT甲级1127. ZigZagging on a Tree

    PAT甲级1127. ZigZagging on a Tree 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二叉树可以通过给定的一对后序和顺序遍历序列来确定.这是一个简单的标准程序,可以按 ...

  9. LeetCode OJ:Binary Tree Zigzag Level Order Traversal(折叠二叉树遍历)

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

随机推荐

  1. JavaScript入门(7)

    一.什么是函数 函数:把完成特定功能的代码放到一个函数里,直接调用这个函数,就省去重复输入大量代码的麻烦 函数的作用:写一次代码,然后反复地重用这个代码 Eg: 求多组数的和,不使用函数 { var ...

  2. java strtus2 DynamicMethodInvocation配置入门 " ! "访问action里面的方法

    这里来讲解一下strtus2动态配置的用法. 配置之后不用通过 <action method="">去配置调用的具体方法. 第一:web.xml <?xml ve ...

  3. android下面的文案重用

    尽可能地在xml中建立各种索引,建立映射表,而不是直接每次索引,这对于大规模的文字变动来说是极有好处的.

  4. 2.redis.3.2 下载,安装、配置、使用 - 2

    上篇简单介绍了 下载,安装,测试,现在直接使用了,看结果 使用的redis服务便是,上篇临时搭建的简易服务,,注意,说的是简易,因为它只是一个单点的“玩具”: 临时在项目登录的时候模拟了一下,这里使用 ...

  5. Visual C++ 打印编程技术-编程基础-获取打印机

    标准方法是用: EnumPrinters() 函数获取 #define PRINTER_ENUM_DEFAULT 0x00000001 #define PRINTER_ENUM_LOCAL 0x000 ...

  6. C#冒泡排序法程序代码

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...

  7. Codevs 1138 聪明的质监员 2011年NOIP全国联赛提高组

    1138 聪明的质监员 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 T 是一名质量监督员, ...

  8. C++实现一个多线程同步方式的协同工作程序示例

    多线程并发程序与协同程序其实是不同的概念.多线程并发是多个执行序同时运行,而协同程序是多个执行序列相互协作,同一时刻只有一个执行序列.今天想到的是将两者结合起来,拿现实生活中的例子来说,假设一个班级有 ...

  9. 使用python发送简单的邮件

    from:http://blog.csdn.net/zhaoweikid/article/details/125898 前些时间,论坛上有人讨论怎么用python发送需要认证的邮件,我在我的FreeB ...

  10. jquery放大镜插件与样式

    这是放大镜插件链接,我已经上传到我博客http://files.cnblogs.com/valiant1882331/%E6%94%BE%E5%A4%A7%E9%95%9C%E6%8F%92%E4%B ...