Espada se refiere a la oferta 29. Imprimir matriz en el sentido de las agujas del reloj
Descripción del Título
Ideas para resolver problemas
Para cada capa, recorra todos los elementos en el sentido de las agujas del reloj desde la parte superior izquierda. Después de atravesar los elementos de la capa actual, aumente la izquierda y la parte superior en 1, y disminuya la derecha y la parte inferior en 1, y entre en la siguiente capa para continuar el recorrido hasta el cruce. Termina con todos los elementos.
¡Tenga en cuenta que hay un pozo!
Debido a la condición de bucle while (left <= right && top <= bottom)
, si la capa actual tiene solo una columna (izquierda == derecha) o solo una fila (arriba == abajo), solo se deben imprimir los bordes superior y derecho; de lo contrario, se repetirá la impresión .
class Solution {
public int[] res;
public int[] spiralOrder(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return new int[0];
//每一层的上下左右四个边界,从最外层开始
int top = 0, bottom = matrix.length - 1, left = 0, right = matrix[0].length - 1;
int[] res = new int[matrix.length * matrix[0].length];
int idx = 0; //res数组的指针
while (left <= right && top <= bottom) {
//上边界:(top, left) ~ (top, right)
for (int i = left; i <= right; i++) res[idx++] = matrix[top][i];
//右边界:(top + 1, right) ~ (bottom, right)
for (int i = top + 1; i <= bottom; i++) res[idx++] = matrix[i][right];
//注意!如果该层仅有一列或仅有一行,则只需打印上边界和右边界,否则会出现重复打印
if(left == right || top == bottom) break;
//下边界:(bottom, right - 1) ~ (bottom, left)
for (int i = right - 1; i >= left; i--) res[idx++] = matrix[bottom][i];
//左边界:(bottom - 1, left) ~ (top + 1, left)
for (int i = bottom - 1; i >= top + 1; i--) res[idx++] = matrix[i][left];
//进入下一层
left++; right--; top++; bottom--;
}
return res;
}
}