胶州家园网站建设,服务器建网站,网站ip改变 备案,大众团购网站怎么做螺旋矩阵
https://leetcode.cn/problems/spiral-matrix/
描述
给你一个 m 行 n 列的矩阵 matrix #xff0c;请按照 顺时针螺旋顺序 #xff0c;返回矩阵中的所有元素。
示例 1 输入#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]]
输出#xff1a;[1,2,3,6,9,8,7,4,5]示…螺旋矩阵
https://leetcode.cn/problems/spiral-matrix/
描述
给你一个 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, [])
};没办法一次性一圈圈的描述出来但是可以把一圈的过程描述出来描述一圈经历了几件事: 顺时针 二维矩阵第一行 (从做到右)二维矩阵最后一列 (从上到下)二维矩阵倒数第一行 (从右到左)二维矩阵第一列 (从下到上) 整体算法 先遍历第一圈减而治之如果还有则递归实现