本周题目难度级别'Medium',使用语言C
题目:给你一个矩阵(C里面就是二维指针),让你螺旋式遍历。eg:给你矩阵:[[1,2,3],[4,5,6],[7,8,9]],螺旋式遍历的结果:[1,2,3,6,9,8,7,4,5]
思路:如果还没理解题目的话,就按照矩阵的格式写在纸上,然后你顺时针螺旋式遍历就行了,我的思路就是顺时针上->右->下->左的转着圈圈遍历即可。具体看代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* spiralOrder(int** matrix, int matrixRowSize, int matrixColSize) {
//如果是空指针
if (matrixRowSize == 0) return 0;
//初始化容器
int size = matrixRowSize * matrixColSize;
int *result = malloc(sizeof(int) * size);
for (int i = 0; i < size; i++) {
result[i] = 0;
}
//遍历的下标
int index = 0;
//循环的次数
int count = 0;
while (index < size -1 || size < 3) {
//正向遍历一行
for (int i = count; i < matrixColSize-count; i++) {
result[index++] = matrix[count][i];
}
//只有一行就返回结果
if ((matrixRowSize-count-count) == 1 ) return result;
//遍历右边一列(从第二行开始,到倒数第二行结束)
for (int i = 1+count; i < matrixRowSize-count - 1;i++) {
result[index++] = matrix[i][matrixColSize-count - 1];
}
//遍历下面一行
for (int i = count; i < matrixColSize-count; i++) {
result[index++] = matrix[matrixRowSize -count- 1][matrixColSize -1-i];
}
//如果只有两行或只有一列就返回结果
if (matrixRowSize-count-count == 2 || matrixColSize-count-count == 1) return result;
//遍历左边一列(从倒数第二行开始,到第二行结束)
for (int i = 1+count; i < matrixRowSize-count - 1;i++) {
result[index++] = matrix[matrixRowSize-1-i][count];
}
count++;
}
//如果是基数位则添加最后一个数字
if (index == size -1) result[size -1] = matrix[matrixRowSize / 2][matrixColSize / 2];
return result;
}
效率嘛,用C的人太少,可参照示例太少,但从复杂度角度来看肯定有更高效的,写C的唯一好处就是让你对内存管理方面更加清晰,因为其他的语言对内存管理已经做的很好了,你基本不用去考虑太多,但C不同,你要去开辟空间,释放空间、处理MUNMAP_CHUNK()、“对齐”等很多问题,比如这道题我剪枝返回matrix[0]都出现了内存问题。。。
网友评论