class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
// for(int i=0;i<n;i++){ 这样的遍历方式不对
// for(int j =0;j<n;j++){
// generateMatrix[i][j] =
// }
// }
//初始化矩阵
vector<vector<int>> matrix(n,vector<int>(n,0));
int a=1;
int left = 0,right = n-1,top = 0,bottom = n-1;
int target = n*n;
while(a<=target){
//遍历从左到右
for(int i = left;i<=right;i++){
matrix[top][i] = a++;
}
top++;
//遍历从右边的上到下
for(int i = top;i<=bottom;i++){
matrix[i][right] = a++;
}
right--;
//遍历下面的从右到左
if(bottom >= top){//检查是否还有有效的行
for(int i = right;i>=left;i--){
matrix[bottom][i] = a++;
}
bottom--;
}
//遍历左边的从下到上
if(left <= right){
for(int i =bottom;i>=top;i--){
matrix[i] [left]= a++;
}
left++;
}
}
return matrix;
}
};
你提到的检查条件:
if (top <= bottom) { // 检查是否还有有效的行
for (int i = right; i >= left; i--) {
matrix[bottom][i] = a++;
}
bottom--;
}
if (left <= right) { // 检查是否还有有效的列
for (int i = bottom; i >= top; i--) {
matrix[i][left] = a++;
}
left++;
}
为什么要在这里加上检查条件?
这段代码是用于控制遍历矩阵的四个边界(上、右、下、左)时,确保我们在遍历过程中不会越界。具体来说,这些检查的作用是 确保我们只遍历有效的行和列,避免在矩阵的某些部分进行多余的填充,导致错误或重复操作。
1. 遍历从右到左的行时:
if (top <= bottom) { // 检查是否还有有效的行
for (int i = right; i >= left; i--) {
matrix[bottom][i] = a++;
}
bottom--;
}
- 在从右到左填充 下边 时,我们希望从
right
到left
填充bottom
行。 - 检查条件
if (top <= bottom)
:当我们填充完一行后,下边的bottom
边界会向上收缩。此时,如果top > bottom
,表示我们已经没有有效的行可以填充了。为了避免越界或重复填充,我们需要检查top
是否小于等于bottom
,只有在有有效行时才执行此部分代码。
2. 遍历从下到上的列时:
if (left <= right) { // 检查是否还有有效的列
for (int i = bottom; i >= top; i--) {
matrix[i][left] = a++;
}
left++;
}
- 在从下到上填充 左边 时,我们希望从
bottom
到top
填充left
列。 - 检查条件
if (left <= right)
:当我们填充完一列后,左边的left
边界会向右收缩。此时,如果left > right
,表示我们已经没有有效的列可以填充了。为了避免越界或重复填充,我们需要检查left
是否小于等于right
,只有在有有效列时才执行此部分代码。
为什么之前没有检查?
之前的遍历部分(上边和右边)没有进行类似的检查,因为在填充 上边 和 右边 时,填充的方向和边界的变化是线性的,不会涉及到“越界”问题。只要从 left
到 right
或从 top
到 bottom
遍历,后续操作就不会再涉及到超出有效区域的情况。
关键点:
-
检查条件是为了避免无效的填充。随着矩阵逐步收缩,填充的区域会减少,直到最终填充完成。边界的收缩导致部分行列已经没有有效区域,这时如果继续遍历,可能会越界或进行不必要的填充。检查条件正是防止这种情况。
-
通过这些检查,确保在边界交错时停止填充,避免出现“越界”或“重复填充”的问题。
总结:
通过检查 top <= bottom
和 left <= right
,我们能够确保每次遍历的行和列是有效的,并且随着矩阵填充的进行,边界会逐步收缩,不会重复或越界。这是为了保证算法的正确性,避免填充无效的行和列。