矩阵算法数据结构,leet code
墨初 知识笔记 124阅读
螺旋矩阵 描述 给你一个 m 行 n 列的矩阵 matrix 请按照 顺时针螺旋顺序 返回矩阵中的所有元素。 示例 1
输入matrix [[1,2,3],[4,5,6],[7,8,9]]输出[1,2,3,6,9,8,7,4,5]
示例 2 输入matrix [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出[1,2,3,4,8,12,11,10,9,5,6,7]
提示 m matrix.lengthn matrix[i].length1 < m, n < 10-100 < matrix[i][j] < 100 算法实现 1 减而治之递归实现
function spiralOrder(matrix: number[][]): number[] { // 处理每一圈的数据遍历过程 const map (arr: number[][], r: number[] []) > { // 第一圈的遍历遍历的时候不会按照 if else if 的顺序遍历而是会按照一行一行的遍历所以最终顺序不用担心 for (let i 0, len arr.length; i < len; i) { if (i 0) { r r.concat(arr[i]) } else if (i len - 1) { r r.concat(arr[i].reverse()) } else { // 增加边界检查 if (arr[i].length) { r.push(arr[i].pop()) } } } arr.shift() // 减而治之移除第一行 arr.pop() // 减而治之移除最后一行 // 第一圈最后的遍历: 倒序从下到上 for (let i arr.length - 1; i > 0; i--) { // 边界检查 if (arr[i].length) { r.push(arr[i].shift()) } } // 边界判断是否还有有则进行递归 if (arr.length) { return map(arr, r) } // 没有直接返回 return r; } return map(matrix, [])};
没办法一次性一圈圈的描述出来但是可以把一圈的过程描述出来描述一圈经历了几件事: 顺时针 二维矩阵第一行 (从做到右)二维矩阵最后一列 (从上到下)二维矩阵倒数第一行 (从右到左)二维矩阵第一列 (从下到上) 整体算法 先遍历第一圈减而治之如果还有则递归实现
标签: