[OJ] Matrix Zigzag Traversal
2016-01-08 00:13
197 查看
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)
相关文章推荐
- jquery-validate常用扩展验证
- linux socket套接字超时之setsockopt
- 一条命令搞定在VMware中的Ubuntu14.04 64 位安装Docker
- SQLServer 动态sql创建指定数据库下的视图
- 秒杀系统架构分析与实战
- [时空与预测]星际迷航-暗黑无边
- LNMP架构下访问php页面出现500错误
- struts2对action指定方法进行校验(人工编码)
- Linux开发四_bootloader启动linux内核
- 用setsockopt()来控制recv()与send()的超时
- 桌面文件自动整理脚本
- cocos2d-3.8.1版本tableview的使用(怎么取消弹簧效果);
- Linux设置socket客户端的连接超时(转)
- Apache与Nginx的优缺点比较
- Wilcoxon test
- 在Lua中调用c++函数
- window平台下使用eclipse进行python开发
- spring mvc web应用程序框架的搭建
- mysql 删除重复数据只保留一条
- linux c socket之异步IO