剑指 Offer 29. 顺时针打印矩阵
题目:
思路:
遍历,没什么说的。刚开始自己使用while,没写出来。用for循环简单点。参数也少
题解:
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix.length <= 0) {
return new int[0];
}
int iMax = matrix.length -1;
int jMax = matrix[0].length-1;
int iMin = 0;
int jMin = 0;
int[] result = new int[(iMax+1) * (jMax+1)];
int count = 0;
extracted(matrix, iMax, jMax, iMin, jMin, result, count);
return result;
}
private void extracted(int[][] matrix, int iMax, int jMax, int iMin, int jMin, int[] result, int count) {
if (count >= result.length) {
return;
}
// 从[0][0]开始顺时针,使用fori才是最简单的,刚开始使用while将问题复杂化了
for (int j = jMin; j <= jMax & count < result.length; j++) {
result[count++] = matrix[iMin][j];
}
iMin++;
for (int i = iMin; i <= iMax & count < result.length; i++) {
result[count++] = matrix[i][jMax];
}
jMax--;
for (int j = jMax; j >= jMin & count < result.length; j--) {
result[count++] = matrix[iMax][j];
}
iMax--;
for (int i = iMax; i >= iMin & count < result.length; i--) {
result[count++] = matrix[i][jMin];
}
jMin++;
extracted(matrix, iMax, jMax, iMin, jMin, result, count);
}
}
不过,为什么空间这么大。
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix.length <= 0) {
return new int[0];
}
int iMax = matrix.length -1;
int jMax = matrix[0].length-1;
int iMin = 0;
int jMin = 0;
int[] result = new int[(iMax+1) * (jMax+1)];
int count = 0;
while (true) {
if (count >= result.length) {
return result;
}
for (int j = jMin; j <= jMax & count < result.length; j++) {
result[count++] = matrix[iMin][j];
}
iMin++;
for (int i = iMin; i <= iMax & count < result.length; i++) {
result[count++] = matrix[i][jMax];
}
jMax--;
for (int j = jMax; j >= jMin & count < result.length; j--) {
result[count++] = matrix[iMax][j];
}
iMax--;
for (int i = iMax; i >= iMin & count < result.length; i--) {
result[count++] = matrix[i][jMin];
}
jMin++;
}
}
}
???