【解题报告】lintcode374螺旋矩阵
题意
螺旋遍历一个矩阵,方向为,右,下,左,上,如此循环
解法
用一个与原数组相同的标记数组来标记已经访问的点,再设置四个函数,处理四种方向的情况,循环调用这四个函数。
代码
public class Solution {
/**
* @param matrix a matrix of m x n elements
* @return an integer list
*/
int[][] flags;
int[][] values;
List<Integer> mList;
public List<Integer> spiralOrder(int[][] matrix) {
// Write your code here
int x = matrix.length;
if (x == 0)
return new ArrayList<>();
int y = matrix[0].length;
if (matrix == null||(x == 0&&y == 0))
return mList;
values = matrix;
mList = new ArrayList<>();
flags = new int[x][y];
int i = 0,j = -1;
while (mList.size() < matrix.length*matrix[0].length){
j = right(i,j+1);
i = down(i+1,j);
j = left(i,j-1);
i = up(i-1,j);
}
return mList;
}
private int right(int i,int j){
while (j < flags[0].length){
if (flags[i][j] != 0){
j--;
break;
}
mList.add(values[i][j]);
flags[i][j] = 1;
j++;
}
if (j >= flags[0].length)
j--;
return j;
}
private int down(int i,int j){
while (i < flags.length){
if (flags[i][j] != 0){
i--;
break;
}
mList.add(values[i][j]);
flags[i][j] = 1;
i++;
}
if (i >= flags.length)
i--;
return i;
}
private int left(int i,int j){
while (j >= 0){
if (flags[i][j] != 0){
j++;
break;
}
mList.add(values[i][j]);
flags[i][j] = 1;
j--;
}
if (j<0)
j = 0;
return j;
}
private int up(int i,int j){
while (i >= 0) {
if (flags[i][j] != 0) {
i++;
break;
}
mList.add(values[i][j]);
flags[i][j] = 1;
i--;
}
if (i < 0)
i = 0;
return i;
}
}