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.
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->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
-
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
-
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
-
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;
}
};
复制代码