当前位置: 首页 > news >正文

【LeetCode 54】螺旋矩阵

问题描述:

解法:

1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客)

int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) { static const int dirs[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; int *ans = malloc(sizeof(*ans) * 100); int row = matrixSize; int col = matrixColSize[0]; int num = row * col; int i = 0; int j = 0; int k = 0; int h = 0; *returnSize = num; while (num--) { /* 记录元素,并标记为已记录 */ ans[k++] = matrix[i][j]; matrix[i][j] = 0xff; /* 下一步可能的位置 */ int curr = i + dirs[h][0]; int next = j + dirs[h][1]; /* 判断下一步可能的位置是否合理,越界或已记录,则右转90° */ if (curr < 0 || curr >= row || next < 0 || next >= col || matrix[curr][next] == 0xff) h = (h + 1) & 0x03; // (x % 4) -> (x & 0x03) /* 下一步的位置 */ i += dirs[h][0]; j += dirs[h][1]; } return ans; }
  • 矩阵 dirs[4][2] 表示四方向偏移数组,存储上下左右四个移动增量,常用于网格类算法。具体含义如下:
下标(上解的h)dx, dy移动方向
0(0, 1)右(列 + 1)
1(1, 0)下(行 + 1)
2(0,-1)左(列 - 1)
3(-1,0)上(行 - 1)
  • if 的判断条件拆解:螺旋遍历数组时,若下一格坐标越界下一格已经走过,则顺时针旋转90°(h%4):

    1.curr < 0:下一步行坐标小于 0,继续向上则将走出矩阵上边界
    2. curr >= row:下一步行坐标 ≥ 总行数,继续向下则将走出矩阵下边界
    3. next < 0:下一步列坐标小于 0,继续向左则将走出矩阵左边界
    4. next >= col:下一步列坐标 ≥ 总列数,继续向右则将走出矩阵右边界
    5. matrix[curr][next] == 0xff:下一步坐标合法且没有越界,但之前已经遍历过

  • (h % 4) → (h & 0x03):对一个正整数取4的余数,本质就是截取其二进制的最后两位,用位运算更快,是常见的优化方式。

2、建立并维护边界

int* sprialOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize) { if (!matrix) return NULL; int top = 0, btm = matrixSize - 1, left = 0, right = matrixColSize[0] - 1; *returnSize = 0; int* arr = malloc(sizeof(int) * matrixSize * matrixColSize[0]); while (top <= btm && left <= right) { /* 左->右,访问第top行 */ for (int i = left; i <= right; i++) arr[(*returnSize)++] = matrix[top][i]; top++; /* 上->下,访问第right列 */ for (int i = top; i <= btm; i++) arr[(*returnSize)++] = matrix[i][right]; right--; /* 右->左,访问第btm行,需要判断即将遍历的这条边是否存在 */ if (top <= btm) { for (int i = right; i >= left; i--) arr[(*returnSize)++] = matrix[btm][i]; btm--; } /* 下->上,访问第left列 */ if (left <= right) { for (int i = btm; i >= top; i--) arr[(*returnSize)++] = matrix[i][left]; left++; } } return arr; }

【LeetCode 54】螺旋矩阵-CSDN博客解法2可看作是上解的优化方案,二者的解决思路比较相似。

http://www.jsqmd.com/news/1250893/

相关文章:

  • 2026 国内 GEO 服务商综合评测:企业选型实用参考 - 品牌前沿专家
  • 90% 的公司,都在给错误的客户打工
  • 中兴OEX超节点+全球首款AI智能体手机亮相WAIC 2026:端侧AI的范式转折
  • 程序员转型大模型开发的路线图与实战指南
  • CPPS考试科目 - 众智商学院官方
  • CNN与Transformer架构对比及计算机视觉应用指南
  • C#中的Dictionary相关方法
  • HarmonyOS开发实战:小分享-ShareCard通用分享卡片组件设计
  • 2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环
  • AGV小车驱动计算
  • GEO 优化全解析:2026 年企业 AI 搜索布局实战指南 - 品牌前沿专家
  • 2026年7月卡地亚贵阳售后服务信息:网点地址与客服热线最新声明 - 卡地亚官方售后中心
  • Harness Engineering落地前,先想清楚这几个问题
  • 案例分享:施企云工程物资云×河南恒屹建设
  • 2026 温州 CMA 甲醛检测口碑名单:温州凌昔甲醛检测中心等 5 家纯检测机构深度测评 - CMA甲醛检测
  • 2026图片去水印软件哪个好用 手机电脑免费工具盘点 - 免费软件工具方法教程
  • 租电脑哪家没套路:雕马极为省心 - 17728098551
  • 刚做了人流适合吃什么好?人流术后饮食调理与科学修护指南
  • 【华为OD技术面试手撕真题】172、第 N 个泰波那契数 | 手撕真题+思路参考+代码解析(C C++ Java Python JS)(0ms)
  • AI为何难懂业务?时序数据库揭秘:融合数据库架构中的原生能力
  • 2026年无锡地区健康管理如何考量?四家机构业务体系概览
  • 武汉卡地亚LOVE钻戒与钻石项链回收变现攻略|多家门店行情参考 - 大牌深度测评
  • 2026 年现阶段,北市评价高的喷淋式杀菌锅订做厂家竞争格局,别再买昂贵设备!这个简单清洁法颠覆你的厨房认知 - 行业推荐官【官方】
  • 客户问“我没在用,为什么云账单还在涨”——每个在线用户,都是一台没关机的云主机
  • Cesium初始化优化
  • Linux 实时任务的 CPU 绑定:taskset 与实时性提升实战教程
  • 2026 周口 CMA 甲醛检测口碑名单:周口博达甲醛检测中心等 5 家纯检测机构深度测评 - CMA甲醛检测
  • 带标注的篮球篮框球员识别数据集,准确率97.9% ,9515张图,支持yolo,coco json,voc xml,文末有模型训练代码
  • 2026 无锡 CMA 甲醛检测口碑名单:无锡凌昔甲醛检测中心等 5 家纯检测机构深度测评 - CMA甲醛检测
  • 2026 益阳 CMA 甲醛检测口碑名单:益阳中科甲醛检测中心等 5 家纯检测机构深度测评 - CMA甲醛检测