Práctica diaria de preguntas de algoritmo --- Día 64: Matriz espiral I

Llega oferta, cava amigos a recoger! Estoy participando en el evento de registro de reclutamiento de primavera de 2022, haga clic para ver los detalles del evento .

I. Introducción

Dada una  m matriz n de filas  y columnas matrix ,   devuelva todos los elementos de la matriz en el sentido de las agujas del reloj.

Enlace temático: Matriz espiral I.

En segundo lugar, los requisitos de la materia.

Ejemplo 1

输入: matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出: [1,2,3,6,9,8,7,4,5]
复制代码

Ejemplo 2

输入: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
复制代码

visita

1.模拟计算
2.建议用时25~35min
复制代码

3. Análisis de problemas

Esta pregunta examina principalmente la idea de simulación, que es un tema relativamente clásico.

1.png

En primer lugar, determinemos el problema de la dirección y los límites.Primero, lo definimos como las cuatro direcciones de arriba, abajo, izquierda y derecha.

Representado por las cuatro letras u, d, l, r

Entre ellos, u=0 (la fila superior), d=el número de filas, l=0 (la columna más a la izquierda) y r=el número de columnas.

Mirando la imagen de arriba, en realidad simulamos cada situación.

  1. 1->2->3->4 representa la dirección de l->r , donde fila=u, columna gradualmente +1 desde l->r , después de llegar a 4, baje a 8, luego u baja una fila, + + tu

  2. 8->12->16 representa la dirección de u->d , donde columna = r, fila gradualmente +1 desde u->d , después de 16, gire a la izquierda hasta 15, luego r mueve una columna a la izquierda, -- r

  3. 15->14->13 representa la dirección de r->l , donde fila=d, la columna es gradualmente -1 desde r->l , después de 13, sube a 9, luego d sube una fila, --d

  4. 9->5 representa la dirección de d->u , donde columna=l, fila desde d->u gradualmente -1, después de llegar a 5, gire a la derecha, luego l mueve una columna a la derecha, ++l

Lo anterior son las cuatro operaciones dentro de un ciclo, para el juicio del límite interno del ciclo:

  • El primer paso ++u>d, salir del ciclo
  • El segundo paso --r<l, salir del ciclo
  • El tercer paso -- d<u , salir del ciclo
  • El cuarto paso ++l>r, salir del ciclo

El siguiente código corresponde estrictamente a los pasos anteriores, espero que todos puedan entenderlo.

En cuarto lugar, la implementación de la codificación.

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int i,u=0,d=matrix.size()-1,l=0,r=matrix[0].size()-1;//确定边界,初始化数据
        vector<int>v;//数组存储
        while(1)//循环内四步转换
        {
            for(i=l;i<=r;i++) v.push_back(matrix[u][i]);//l->r方向
            if(++u>d) break;
            for(i=u;i<=d;i++) v.push_back(matrix[i][r]);//u->d方向
            if(--r<l) break;
            for(i=r;i>=l;i--) v.push_back(matrix[d][i]);//r->l方向
            if(--d<u) break;
            for(i=d;i>=u;i--) v.push_back(matrix[i][l]);//d->u方向
            if(++l>r) break;
        }
        return v;
    }
};
复制代码

5. Resultados de la prueba

2.png

3.png

Supongo que te gusta

Origin juejin.im/post/7080305745694031909
Recomendado
Clasificación