spiralMatrix

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* spiralOrder(int** matrix, int matrixRowSize, int matrixColSize) {
    int* vector = malloc( sizeof(int) * matrixRowSize * matrixColSize );
    int x0 = 0;  // top left x
    int y0 = 0;  // top left y
    int count=0;
    int i=0;

    if( 0 == matrixRowSize  || 0 == matrixColSize ){
        return NULL;
    }
    
    if( 1 == matrixRowSize || 1 == matrixColSize ){
        for(int i=0; i<matrixRowSize; i++){
            for(int j=0; j<matrixColSize; j++){
                vector[count++]=matrix[i][j];
            }
        }
        return vector;
    }
    
    
    // loop
    while(matrixRowSize >=1 && matrixColSize >=1){

        int x1 = x0 + matrixRowSize - 1;  // bottom right x 
        int y1 = y0 + matrixColSize - 1;  // bottom right y
        
        // first row
        for(i=y0; i<=y1; i++){
            vector[count++] = matrix[x0][i];
        }
        
        // last col
        for(i=x0+1; i<=x1; i++){
            vector[count++] = matrix[i][y1];
        }
        
        
        // last row
        if(matrixRowSize > 1){      // matrix need to be at least two rows 
            for(i=y1-1; i>=y0; i--){
                vector[count++] = matrix[x1][i];
            }
        }
        // first col
        if(matrixColSize > 1){     // matrix need to be at least two cols
            for(i=x1-1; i>=x0+1; i--){
                vector[count++] = matrix[i][y0];
            }
        }
        x0++;
        y0++;
        matrixRowSize-=2;
        matrixColSize-=2;
    }
    return vector;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是一个Java类,名为SpiralMatrix,其中包含一个spiralOrder方法,用于按照螺旋的顺序遍历一个二维矩阵,并将每个元素加入到结果列表中。 具体实现如下: ```java import java.util.ArrayList; import java.util.List; public class SpiralMatrix { public List<Integer> spiralOrder(int[][] matrix) { // 定义一个存放结果的列表 List<Integer> res = new ArrayList<>(); // 如果矩阵为空或者行数为0,直接返回结果列表 if (matrix == null || matrix.length == 0) { return res; } // 获取矩阵的行数和列数 int m = matrix.length, n = matrix[0].length; // 定义四个边界变量,分别代表当前遍历到的矩阵的上下左右四个边界 int left = 0, right = n - 1, top = 0, bottom = m - 1; // 进入循环,按照螺旋的顺序遍历矩阵,并把每个元素加入到结果列表中 while (left <= right && top <= bottom) { // 从左到右遍历矩阵的上边界 for (int i = left; i <= right; i++) { res.add(matrix[top][i]); } // 从上到下遍历矩阵的右边界 for (int i = top + 1; i <= bottom; i++) { res.add(matrix[i][right]); } // 如果上下边界不重合,从右到左遍历矩阵的下边界 if (top != bottom) { for (int i = right - 1; i >= left; i--) { res.add(matrix[bottom][i]); } } // 如果左右边界不重合,从下到上遍历矩阵的左边界 if (left != right) { for (int i = bottom - 1; i > top; i--) { res.add(matrix[i][left]); } } // 调整边界变量,继续遍历矩阵的下一个螺旋圈 left++; right--; top++; bottom--; } // 返回结果列表 return res; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值