[OJ] Matrix Zigzag Traversal
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)
可以看到各行x与y坐标的和是常数, 且该和逐行递增.
- 偶数行
x递减, 奇数行x递增. - 原解法有个缺陷是"矩阵越细长, 空循环就越多". 我的解法对这点进行了优化.
时间复杂度:O(m*n)
空间复杂度:O(1)
[OJ] Matrix Zigzag Traversal的更多相关文章
- Matrix Zigzag Traversal(LintCode)
Matrix Zigzag Traversal Given a matrix of m x n elements (m rows, ncolumns), return all elements of ...
- 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 ...
- lintcode:Matrix Zigzag Traversal 矩阵的之字型遍历
题目: 矩阵的之字型遍历 给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历. 样例 对于如下矩阵: [ [1, 2, 3, 4], [5, 6, 7, 8], [9 ...
- LeetCode OJ:ZigZag Conversion(字符串的Z字型转换)
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- [LintCode]——目录
Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...
- Java Algorithm Problems
Java Algorithm Problems 程序员的一天 从开始这个Github已经有将近两年时间, 很高兴这个repo可以帮到有需要的人. 我一直认为, 知识本身是无价的, 因此每逢闲暇, 我就 ...
- 别再埋头刷LeetCode之:北美算法面试的题目分类,按类型和规律刷题,事半功倍
算法面试过程中,题目类型多,数量大.大家都不可避免的会在LeetCode上进行训练.但问题是,题目杂,而且已经超过1300道题. 全部刷完且掌握,不是一件容易的事情.那我们应该怎么办呢?找规律,总结才 ...
- PAT甲级1127. ZigZagging on a Tree
PAT甲级1127. ZigZagging on a Tree 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二叉树可以通过给定的一对后序和顺序遍历序列来确定.这是一个简单的标准程序,可以按 ...
- 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 ...
随机推荐
- iframe父子窗口取值
父窗口中操作iframe:window.frames["iframeChild"].document //假如iframe的id为iframeChild 在子窗口中操作父窗口:wi ...
- ADO.NET连接数据库的两种方式
//实现了IDisposable接口的类,用using括起来 //插入数据 string connString = "Data Source=(local);Initial Catalog= ...
- 对bigDecimal的一些探索
一般直接用简单的double等来做浮点计算可能会因为计算机的浮点运算机制出现一点问题,不符合生活中的计算常识,于是java就给我们包装了大数据类,bigdecimal用于处理浮点数据类.当然也有处理整 ...
- MVC小系列(三)【MVC的分部视图】
MVC的分部视图: 分部视图在action中返回一定要用PartialView(),而不要偷懒使用View(),因为如果使用后者,系统会认为是一个标准视图,会为它加个默认的母版页(LayOut),除非 ...
- cmd命令积累
dir:展示所有目录 cd fileName:进入下一个目录 cd .. :返回上一层目录 cd\:返回根目录
- (一)JAVA使用POI操作excel
1,Poi 简介 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能 PO ...
- iOS谋职之OC面试题
iOS谋职之OC面试题 iOS求职之OC面试题 IOS求职之OC面试题 1.Objective-C的类可以多重继承么?可以采用多个协议么? 答:不可以多重继承,可以采用多个协议. 2.#import和 ...
- 01_JavaMail_03_邮件发送简单实例
[JavaMail中的核心类] 1.Session:类似Jdbc中的Connection的作用 2.MimeMessage:邮件信息类 3.Transport:发送器,用来发送邮件 [工程截图] [具 ...
- ubuntu14.04+opencv 3.0+python2.7安装及测试
本文记录了ubuntu下使用源码手动安装opencv的过程.步骤来自opencv官网 此外记录了在python中安装及载入opencv的方法. 1.安装opencv所需的库(编译器.必须库.可选库) ...
- 【转】Oracle job procedure 存储过程定时任务
原文:Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相 ...