題目地址:
https://www.lintcode.com/problem/matrix-zigzag-traversal/description
給定一個二維矩陣,行列,顯然按照從右上到左下,整個矩陣被可以看成由條對角線,要求按照如下方式遍歷:
1、第奇數條對角線按照從左下到右上遍歷;
2、第偶數條對角線按照從右上到左下遍歷;
3、按照從左上到右下的順序遍歷這些對角線。
要求返回遍歷的結果。
從出發,先向右上走,一路記錄走過的數直到走不動爲止,此時看一下右邊是否可以走,如果可以就走,否則向下走一步,接着向左下走,一路記錄走過的數直到走不動爲止,此時看一下下面是否可以走,如果可以就走,否則向右走一步。如此這樣直到所有數走完。代碼如下:
public class Solution {
/**
* @param matrix: An array of integers
* @return: An array of integers
*/
public int[] printZMatrix(int[][] matrix) {
// write your code here
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return new int[0];
}
int n = matrix.length, m = matrix[0].length;
int[] res = new int[n * m];
// idx記錄走過的數在res裏的下標,x代表行座標,y代表列座標
int idx = 0, x = 0, y = 0;
while (idx < n * m) {
while (x >= 0 && y < m) {
// 一路想右上走
res[idx++] = matrix[x][y];
x--;
y++;
}
// 走出界了所以回退一步
x++;
y--;
// 如果右邊可以走則走一步,否則向下走一步
if (y + 1 < m) {
y++;
} else {
x++;
}
while (x < n && y >= 0) {
// 一路想左下走
res[idx++] = matrix[x][y];
x++;
y--;
}
// 回退一步
x--;
y++;
// 如果下邊可以走則走一步,否則向右走一步
if (x + 1 < n) {
x++;
} else {
y++;
}
}
return res;
}
}
時間複雜度,空間。