OR38. 顺时针打印矩阵
描述
对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。
给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。
[[1,2],[3,4]],2,2
返回:[1,2,4,3]
C++ 解法, 执行用时: 5ms, 内存消耗: 544KB, 提交时间: 2022-01-22
class Printer { public: vector<int> clockwisePrint(vector<vector<int> > mat, int n, int m) { vector<int>ret; int left = 0, right = m-1, bottom = n-1, top =0; while(true) { for(int i = left; i <= right; ++i) { ret.push_back(mat[left][i]); } if(++top > bottom) { break; } for(int j = top; j <= bottom; ++j) { ret.push_back(mat[j][right]); } if(--right < left) { break; } for(int k = right; k >= left; --k) { ret.push_back(mat[bottom][k]); } if(--bottom < top) { break; } for(int n = bottom; n >= top; --n) { ret.push_back(mat[n][left]); } if(++left > right) { break; } } return ret; } };
C++ 解法, 执行用时: 6ms, 内存消耗: 532KB, 提交时间: 2022-02-03
class Printer { public: vector<int> clockwisePrint(vector<vector<int> > mat, int n, int m) { // write code here vector<int> ret; int x1 = 0,y1 = 0; //左上角坐标 int x2 = n-1,y2 = m-1; //右上角坐标 //按照要求打印最外圈的数据,打印完后,缩小矩形的大小 while(x1 <= x2 && y1 <= y2) { for(int j = y1; j <= y2; ++j) //第一行 ret.push_back(mat[x1][j]); for(int i = x1 + 1; i < x2; ++i)//最后一列 从第二个开始,不包括右下角数 ret.push_back(mat[i][y2]); for(int j = y2; x1 < x2 && j >= y1; --j) //最后一行 ret.push_back(mat[x2][j]); for(int i = x2-1; y1 < y2 && i > x1; --i) //第一列 ret.push_back(mat[i][y1]); x1++; y1++; x2--; y2--; } return ret; } };