1.题目:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
2.示例:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
3.思路:
思路
标签:二维数组
整体思路:循环遍历整个数组,循环中再嵌套四个循环,分别是从左至右,从上至下,从右至左,从下至上这几个方向,按照题意将整个数组遍历完成,控制好边界
mm 为行数,nn 为列数,时间复杂度:O(mn)O(mn),空间复杂度:O(1)O(1)
算法流程
题目中 matrix 有可能为空,直接返回空数组即可
初始化边界 left、right、top、bottom 四个值,初始化结果数组 res 和数组下标 x
按照遍历方向循环取出数字放入结果数组中
从左至右:遍历完成后 ++up,如果 up > down,到达边界循环结束
从上至下:遍历完成后 --right,如果 left > right,到达边界循环结束
从右至左:遍历完成后 --down,如果 up > down,到达边界循环结束
从下至上:遍历完成后 ++left,如果 left > right,到达边界循环结束
4.题解:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
*returnSize = matrixSize*(*matrixColSize);//返回数组大小
int *p;
p = malloc(sizeof(int)*matrixSize*(*matrixColSize));//开辟保存数组
int left=0,right=*matrixColSize-1,up=0,down=matrixSize-1;
int cnt = 0;
while(1){
for(int i=left;i<=right;i++){
p[cnt++] = matrix[left][i]; //从左到右
}
up++;
if(up>down) break;
for(int i=up;i<=down;i++){
p[cnt++] = matrix[i][right];//从下到上
}
right--;
if(right<left) break;
for(int i=right;i>=left;i--){
p[cnt++] = matrix[down][i];//从右到左
}
down--;
if(up>down) break;
for(int i=down;i>=up;i--){
p[cnt++] = matrix[i][left];//从下到上
}
left++;
if(left>right) break;
}
return p;
}