54. 螺旋矩阵
题目链接:
a54. 螺旋矩阵
题目描述:
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
题目分析:
改题目需要判断是否溢出边界,与59不同,59可以判断是否为0来作为溢出条件,此题可以建立一个是否遍历过的数组来作为判断溢出的条件
本方法为通过定义上下左右四个边界来判断,每个方向遍历结束之后将x,y置为下一个位置
从第二个位置开始遍历和赋值,每个重合的角让当前循环来赋值,而代码随想录上解析是让下一个循环来赋值,有兴趣的可以看代码随想录b站视频
题解:
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize) {*returnSize = matrixSize * *matrixColSize;// 定义遍历坐标x,y从(0,1)开始int x = 0;int y = 1;// 定义赋值时返回数组的角标int i = 1;// 为返回数组分配空间int *arr = (int *)malloc(sizeof(int) * matrixSize * *matrixColSize);// 定义四个边界上下左右int top = 0;int bottom = matrixSize;int left = 0;int right = matrixColSize[0];// 为初始位置赋值arr[0] = matrix[0][0];while(top <= bottom && left <= right){// 先向右遍历矩阵,直到越界// 当此次循环向右遍历完成之后,还要继续向下执行,所以要判断i是否小于返回数组的大小,以防越界// 向右遍历时可以不进行判断i是否溢出,但剩下三个必须判断while(y < right && i < *returnSize){arr[i++] = matrix[x][y++];}// 上边界缩小top++;// 将y赋值为不越界的状态,且x指向下一行,即将x,y指向下一个遍历的位置y--;x++;// 向下遍历矩阵,直到溢出边界,需要判断i是否产生溢出while(x < bottom && i < *returnSize){arr[i++] = matrix[x++][y];}// 右边界缩小right--;// 将x赋值为不越界的状态,且y指向上一列,即将x,y指向下一个遍历的位置x--;y--;// 向左遍历矩阵,直到溢出边界,需要判断i是否产生溢出while(y >= left && i < *returnSize){arr[i++] = matrix[x][y--];}// 下边界缩小bottom--;// 将x,y指向下一个遍历的位置y++;x--;// 向上遍历矩阵,直到溢出边界,需要判断i是否产生溢出while(x >= top && i < *returnSize){arr[i++] = matrix[x--][y];}// 下边界缩小left++;// 将x,y指向下一个遍历的位置x++;y++;// 若未遍历完数组,进行下一次循环}return arr;
}