6.leetcode剑指offer (给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。)c语言

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;
      

}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pg_hj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值