Hoy escribí una pregunta de simulación media durante 30 minutos, pero los ingresos (xiang) eran (shui) bastante (bo) ricos (ke) ,
Por lo tanto, clasifiqué especialmente mis habilidades para escribir preguntas simuladas y las compartí contigo.
El problema de simulación más clásico es la matriz de serpientes,
No hablaremos de esto hoy (bushi
Enlace del tema:
498. Travesía diagonal - LeetCode https://leetcode.cn/problems/diagonal-traverse/submissions/
Ideas del tema:
1. Divida el gran problema en pequeños problemas periódicos: en esta pregunta, podemos dividir el recorrido hacia arriba y hacia abajo en un ciclo, y simular la situación de cada ciclo por separado, y el problema se volverá simple;
2. Comenzando desde el límite, en cada ciclo de recorrido, sin importar si está atravesando oblicuamente hacia arriba o hacia abajo, se detiene inmediatamente después de alcanzar el límite de la matriz. Para el límite, se puede dividir en tres situaciones: en la diagonal Por encima de la línea, en la diagonal, por debajo de la diagonal. Tome los tres casos y escriba el código condicional por separado (no tenga miedo de que el código sea demasiado largo)
3. Preste especial atención al caso especial: el hecho de que esta pregunta no se le dé deliberadamente a la matriz cuadrada es en realidad para asustar a la gente. Solo hay un caso especial real, es decir, el caso de una sola columna, y el juicio termina por separado. .
Finalmente: el código
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
vector<int>ans;
int x = mat.size();
int y = mat[0].size();
int i = 0;
int j = 1;
if (y == 1)
{
for (int i = 0; i < x; i++)
ans.push_back(mat[i][0]);
return ans;
}
ans.push_back(mat[0][0]);
while (j >= 0 && i <= x - 1 && i >= 0 && j <= y - 1)
{
// 向下遍历
while (j >= 0 && i <= x - 1 && i >= 0 && j <= y - 1)
{
ans.push_back(mat[i][j]);
if (j == 0 && i == x - 1) //在左下角
{
j++;
break;
}
else if (i <= x - 1 && j == 0) // 在左边界不在左下角
{
i++;
break;
}
else if (i == x - 1 && j != 0) // 在下边界不在左下角
{
j++;
break;
}
else
{
i++;
j--;
}
}
// 向上遍历
while (j >= 0 && i <= x - 1 && i >= 0 && j <= y - 1)
{
ans.push_back(mat[i][j]);
if (j == y - 1 && i == 0) // 在右上角
{
i++;
break;
}
else if (i == 0 && j != y - 1) // 在上边界不在右上角
{
j++;
break;
}
else if (j == y - 1 && i != 0) // 在右边界不在右上角
{
i++;
break;
}
else
{
j++;
i--;
}
}
}
return ans;
}
};
Aquellos que estén interesados pueden ir a ver el relleno del número en forma de serpiente >>》》
Espero compartir con usted. .