Spiral Matrix

题目大意:给一个m行n列的二维数组,要求以螺旋顺序返回所有元素。例如二维数组

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
将返回 [1,2,3,6,9,8,7,4,5]

思路分析:每次螺旋一圈作为外层循环,内层循环分为四段,从左往右,从上到下,从右往左,从下到上。先上代码:

int* spiralOrder(int** matrix, int matrixRowSize, int matrixColSize) {
    int i,j,k,m,n,p=0,s;
    s = matrixRowSize * matrixColSize;
    int *r = (int *)malloc(sizeof(int) * s);
    for(i=0; i<(matrixRowSize+1)/2 && p<s; i++) {
        for(j=i; j<matrixColSize-i && p<s; j++) {    //从左往右
            r[p++] = matrix[i][j];
        }
        for(k=i+1; k<matrixRowSize-i && p<s; k++) {   //从上到下
            r[p++] = matrix[k][j-1];
        }
        for(m=j-2; m>=i && p<s; m--) {       //从右到左
            r[p++] = matrix[k-1][m]; 
        }
        for(n=matrixRowSize-i-2; n>=i+1 && p<s; n--) {     //从下到上
            r[p++] = matrix[n][m+1]; 
        }
    }
    return r;
}
注意事项:一是外层循环的判断条件
i<(matrixRowSize+1)/2 && p<s      //也可以把matrixRowSize 换成 matrixColSize

二是要及时判断p的值是否已经达到了最大值,只有当p<matrixRowSize * matrixColSize时才继续循环,否则p超出了范围会出现runtime error。但是每个地方都判断一下好像挺麻烦的,如有人能有更优雅的方式,还望不吝赐教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值