算法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
浙公网安备 33010602011771号