题目:
容易 矩阵的之字型遍历
给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历。样例
对于如下矩阵:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10, 11, 12]
]
返回 [1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12]
方向:右、左下、右上、下;
思路:根据当前位置(i,j)和上一步的方向,决定下一步的方向
代码:
public class Solution {
/**
* @param matrix: a matrix of integers
* @return: an array of integers
*/
public int[] printZMatrix(int[][] matrix) {
// write your code here
if(matrix == null)
return null;
int m = matrix.length;
if(m == 0)
return null;
int n = matrix[0].length;
int[] array = new int[m*n];
int loc =0;
if(n == 0)
return null;
boolean flag = true;
int i =0;
int j =0;
int RIGHT = 0;
int LEFTDOWN = 1;
int DOWN = 2;
int RIGHTUP = 3;
int state = -1;
if(m == 1){
for(int k=0; k<n;k++){
array[loc++] = matrix[0][k];
}
return array;
}
if(n==1){
for(int k=0; k<m;k++){
array[loc++] = matrix[k][0];
}
return array;
}
while(loc < m*n){
if(i!=0 || j!=0){
array[loc++] = matrix[i][j];
switch(state){
case 0://RIGHT
if(i == 0){//LEFTDOWN
i++;
j--;
state = LEFTDOWN;
}else{//RIGHTUP
j++;
i--;
state = RIGHTUP;
}
break;
case 1://LEFTDOWN
if(j == 0){
if(i<m-1){//DOWM
i++;
state = DOWN;
}else{
j++;
state = RIGHT;
}
}else{//LEFTDOWN
if(i == m-1){//RIGHT
j++;
state = RIGHT;
}else{
i++;
j--;
state = LEFTDOWN;
}
}
break;
case 2://DOWN
if(j==0){
// if(i<m-1){//RIGHTUP
i--;
j++;
state = RIGHTUP;
}else if(j == n-1){//LEFTDOWN
i++;
j--;
state = LEFTDOWN;
}
break;
case 3://RIGHTUP
if(i == 0){
if(j != n-1){//RIGHT
j++;
state = RIGHT;
}else{//DOWN
i++;
state = DOWN;
}
}else{
if(j == n-1){//DOWM
i++;
state = DOWN;
} else{//RIGHTUP
j++;
i--;
state = RIGHTUP;
}
}
break;
}
}else{
array[loc++] = matrix[0][0];
state = RIGHT;
j++;
}
}
return array;
}
}