59. 螺旋矩阵 II

59. 螺旋矩阵 II

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--;
}
  • 在从右到左填充 下边 时,我们希望从 rightleft 填充 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++;
}
  • 在从下到上填充 左边 时,我们希望从 bottomtop 填充 left 列。
  • 检查条件 if (left <= right):当我们填充完一列后,左边的 left 边界会向右收缩。此时,如果 left > right,表示我们已经没有有效的列可以填充了。为了避免越界或重复填充,我们需要检查 left 是否小于等于 right,只有在有有效列时才执行此部分代码。

为什么之前没有检查?

之前的遍历部分(上边和右边)没有进行类似的检查,因为在填充 上边右边 时,填充的方向和边界的变化是线性的,不会涉及到“越界”问题。只要从 leftright 或从 topbottom 遍历,后续操作就不会再涉及到超出有效区域的情况。

关键点:

  • 检查条件是为了避免无效的填充。随着矩阵逐步收缩,填充的区域会减少,直到最终填充完成。边界的收缩导致部分行列已经没有有效区域,这时如果继续遍历,可能会越界或进行不必要的填充。检查条件正是防止这种情况。

  • 通过这些检查,确保在边界交错时停止填充,避免出现“越界”或“重复填充”的问题。

总结:

通过检查 top <= bottomleft <= right,我们能够确保每次遍历的行和列是有效的,并且随着矩阵填充的进行,边界会逐步收缩,不会重复或越界。这是为了保证算法的正确性,避免填充无效的行和列。

注意边界的处理要仔细

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值