北京网站建设求职简历,十堰seo优化教程,外贸平台网站的营销方式,100款免费软件网站大全快一个月没刷题了#xff0c;最近工作有些忙#xff0c;今天闲下来两小时#xff0c;刷一道 题目描述
给你一个 m 行 n 列的矩阵 matrix #xff0c;请按照 顺时针螺旋顺序 #xff0c;返回矩阵中的所有元素。
示例 1#xff1a; 输入#xff1a;matrix [[1,2,3],[4… 快一个月没刷题了最近工作有些忙今天闲下来两小时刷一道 题目描述
给你一个 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]
解题思路
控制上下边界、左右边界。每一次循环走一圈走完一圈上下左右边界往内部压缩。结束条件是leftright topbottom
首先初始化上边界为第0行下边界为最后一行左边界是第0列右边界是最后一列。可以看出边界就是要加到res返回数组的一圈。接下来一个循环条件是true(无限循环)虽然终止条件是leftright topbottom但是在走一圈的过程中就可能会触发终止条件而不是一圈结束了才会触发终止条件。因此在遍历四个时每遍历一个边就判断一次终止条件
代码
var spiralOrder function(matrix) {let left 0; // 初始化左边界为第0列let right matrix[0].length-1; // 初始化右边界为最后一列let top 0; // 初始化上边界为第0行let bottom matrix.length-1; // 初始化下边界为最后一行let res []; // 初始化结果数组用于存储最终的螺旋顺序元素while(true){ // 开始一个无限循环for(let ileft;iright;i){ // 从左到右遍历第一行res.push(matrix[top][i]); // 将第一行的元素添加到结果数组}top; // 遍历完第一行后上边界下移if(topbottom)break; // 如果上边界超过了下边界结束循环for(let itop;ibottom;i){ // 从上到下遍历最后一列res.push(matrix[i][right]); // 将最后一列的元素添加到结果数组}right--; // 遍历完最后一列后右边界左移if(rightleft)break; // 如果右边界小于左边界结束循环for(let iright;ileft;i--){ // 从右到左遍历最后一行res.push(matrix[bottom][i]); // 将最后一行的元素添加到结果数组}bottom--; // 遍历完最后一行后下边界上移if(bottomtop) break; // 如果下边界小于上边界结束循环for(let ibottom;itop;i--){ // 从下到上遍历第一列res.push(matrix[i][left]); // 将第一列的元素添加到结果数组}left; // 遍历完第一列后左边界右移if(leftright) break; // 如果左边界超过了右边界结束循环}return res; // 返回结果数组
};案例分析
示例 1 输入matrix [[1,2,3],[4,5,6],[7,8,9]] 输出[1,2,3,6,9,8,7,4,5]
逐步分析 初始化边界 left 0right 2top 0bottom 2 第一次循环 从左到右遍历第一行top行[1, 2, 3] 添加到 res res [1, 2, 3] toptop 1检查边界top bottom1 2继续。 第二次循环 从上到下遍历最后一列right列[6, 9] 添加到 res res [1, 2, 3, 6, 9] right--right 1检查边界right left1 0继续。 第三次循环 从右到左遍历最后一行bottom行[8, 7] 添加到 res res [1, 2, 3, 6, 9, 8, 7] bottom--bottom 1检查边界bottom top1 1继续。 第四次循环 从下到上遍历第一列left列[4] 添加到 res res [1, 2, 3, 6, 9, 8, 7, 4] leftleft 1检查边界left right1 1继续。 第五次循环 从左到右遍历第二行top行[5] 添加到 res res [1, 2, 3, 6, 9, 8, 7, 4, 5] toptop 2检查边界top bottom2 1循环结束。
结论 循环在第五次遍历后结束因为此时 top bottom 的条件满足。因此最终结果数组 res 为 [1, 2, 3, 6, 9, 8, 7, 4, 5]。