典型营销型网站有哪些,南昌网站建设行业现状,合肥住房城乡建设部的网站,wordpress iconic54. 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix #xff0c;请按照 顺时针螺旋顺序 #xff0c;返回矩阵中的所有元素。 示例 1#xff1a; 输入#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出#xff1a;[1,2,3,6,9,8,7,4,5] 解题思路
顺时针螺旋顺序也就是“从左向…54. 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix 请按照 顺时针螺旋顺序 返回矩阵中的所有元素。 示例 1 输入matrix [[1,2,3],[4,5,6],[7,8,9]] 输出[1,2,3,6,9,8,7,4,5] 解题思路
顺时针螺旋顺序也就是“从左向右、从上向下、从右向左、从下向上” 循环。那么算法的核心就是模拟这个过程 定义左、右、上、下 四个边界 l , r , t , b然后按照这个顺序遍历同时收缩边界直到遍历完所有元素。
定义左、右、上、下 四个边界 l , r , t , b从左到右遍历上边界遍历完将上边界下移从上到下遍历右边界遍历完将右边界左移从右到左遍历下边界遍历完将下边界上移从下到上遍历左边界遍历完将左边界右移重复上述步骤直到遍历完所有元素
代码实现
//这是错的往下看
vectorint spiralOrder(vectorvectorint matrix) {int m matrix.size(),nmatrix[0].size();int l 0, r n - 1, t 0, b m - 1;int i 0, nums n *m;vectorint ans;while (i nums) {// 向右for (int j l; j r; j) {ans.push_back(matrix[t][j]);i;}// 向下t;for (int j t; j b; j) {ans.push_back(matrix[j][r]);i;}//向左r--;for (int j r; j l; j--) {ans.push_back(matrix[d][j]);i;}//向上b--;for (int j b; j t; j--) {ans.push_back(matrix[j][l]);i;}l;}return ans;}这段代码符合上述算法流程但是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 ,6 ]多输出了一个6在向右遍历的时候这段代码正确的将6和7加入到了ans中但是此时i12,l1,r2接着开始向下遍历执行t后此时t2,b1不满足循环条件跳过接着向左移动执行r--后此时r1,l1竟然满足循环条件进入了循环把6又加到了ans中所以在每一个循环中还有一个循环条件就是inums防止多输出元素。 下面这段代码才是正确的代码
vectorint spiralOrder(vectorvectorint matrix) {int m matrix.size(),nmatrix[0].size();int l 0, r n - 1, t 0, b m - 1;int i 0, nums n *m;vectorint ans;while (i nums) {// 向右for (int j l; j rinums; j) {ans.push_back(matrix[t][j]);i;}// 向下t;for (int j t; j binums; j) {ans.push_back(matrix[j][r]);i;}//向左r--;for (int j r; j linums; j--) {ans.push_back(matrix[d][j]);i;}//向上b--;for (int j b; j tinums; j--) {ans.push_back(matrix[j][l]);i;}l;}return ans;
}或者说当上边界和下边界相遇或左边界和右边界相遇时直接跳出循环防止多输出元素
vectorint spiralOrder(vectorvectorint matrix) {int m matrix.size(),nmatrix[0].size();int l 0, r n - 1, t 0, b m - 1;vectorint ans;while (true) {for (int i l; i r; i) ans.push_back(matrix[t][i]); //向右if (t b) break;for (int i t; i b; i) ans.push_back(matrix[i][r]); // 向下if (l --r) break;for (int i r; i l; i--) ans.push_back(matrix[b][i]); // 向左if (t --b) break;for (int i b; i t; i--) ans.push_back(matrix[i][l]); //向上if (l r) break;}return ans;
}