Espada se refiere a la oferta 29. Imprimir matriz en el sentido de las agujas del reloj

Espada se refiere a la oferta 29. Imprimir matriz en el sentido de las agujas del reloj

Descripción del Título

Inserte la descripción de la imagen aquí

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.

Inserte la descripción de la imagen aquí
¡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;
    }
}

Supongo que te gusta

Origin blog.csdn.net/cys975900334/article/details/115079631
Recomendado
Clasificación