算法day5 螺旋矩阵

题目描述

思路:

对于这样的一个旋转矩阵模型,我们在进行赋值的时候,可以盯住每次行坐标不变(纵坐标不变)来进行边界的限制。为了统一,我们在取每一行(列)的区间时采取左闭右开的思想,即每一次行更新(列更新)我们都只计算[begin,end)这样一个范围,这样就可以避免赋值的重复。同时,我们可以设置start_x、start_y、offset等变量来设置每一圈的行起始、列起始以及限制范围。最后,考虑到n*n矩阵的n的奇偶情况的差异,要特别为n为奇数的情况做一个判断,从而完整的赋值整个矩阵。

具体的代码如下所示。

  vector<vector<int>> generateMatrix(int n) {
    vector<vector<int>> matrix(n,vector<int>(n,0));
    int start_x = 0,start_y = 0; //行起始与列起始
    int offset = 1;
    int count = 1;//二维数组的首元素为1
    int cnt = n/2;
    int i,j;
    while(cnt--){
        i = start_x;
        j = start_y;
        for(j;j < n-offset;j++){  //判断条件 j < n - offset ,即在循环过程中采取左闭右开的区间策略,下面的判断同理
            matrix[i][j] = count++;
        }
        for(i;i<n-offset;i++){
            matrix[i][j] = count++;
        }
        //这里注意判断的时候要写startx或starty,不要写0,因为在每一个圈次中,边界的值都在变
        for(;j>start_y;j--){//此时i,j均已达到临界值
            matrix[i][j] = count++;
        }
        for(;i>start_x;i--){
            matrix[i][j] = count++;
        }
        //每一轮次过后对应的行起始与列起始以及offset偏移都要自增,从而进行内圈的赋值
        start_x++;
        start_y++;
        offset++;
    }
    if(n%2==1){
            matrix[n/2][n/2] = count;
        }

   return matrix;

}

时间复杂度:O(n^2)
空间复杂度:O(n^2)

END

posted on 2025-04-06 14:45  sakura430  阅读(14)  评论(0)    收藏  举报