博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[OJ] Matrix Zigzag Traversal
阅读量:5127 次
发布时间:2019-06-13

本文共 2066 字,大约阅读时间需要 6 分钟。

class Solution {public:    vector
printZMatrix(vector
> &matrix) { vector
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
printZMatrix(vector
> &matrix) { vector
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)

转载于:https://www.cnblogs.com/7z7chn/p/5111760.html

你可能感兴趣的文章
steelray project viewer
查看>>
itext jsp页面打印
查看>>
HTTP之报文
查看>>
Perl正则表达式匹配
查看>>
windows下的文件管理工具--total commander
查看>>
react-01
查看>>
sublime插件安装
查看>>
SetForegroundWindow
查看>>
数据库存储系统应用,超市小票系统
查看>>
Git
查看>>
DB Change
查看>>
nginx --rhel6.5
查看>>
Eclipse Python插件 PyDev
查看>>
selenium+python3模拟键盘实现粘贴、复制
查看>>
第一篇博客
查看>>
typeof与instanceof的区别
查看>>
网站搭建(一)
查看>>
SDWebImage源码解读之SDWebImageDownloaderOperation
查看>>
elastaticsearch
查看>>
postgreSQL 简单命令操作
查看>>