题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
解题思路
方法一:直接法
1、思路:每打印一圈矩阵,就将矩阵的边界收缩一格,这里用四个变量记录当前矩阵,即矩阵的左上角和右下角坐标,用四个for循环打印矩阵的最外圈,需要注意的是在打印矩阵的下边界和左边界时,需要分别判断当前矩阵的高和宽,以免重复打印。
2、代码:
class Solution {
public:
void print(vector<vector<int> > matrix, vector<int> &result, int leftX, int leftY, int rightX, int rightY) {
int i, j;
for (i = leftX; i <= rightX; i++) {
result.push_back(matrix[leftY][i]);
}
for (j = leftY + 1; j <= rightY; j++) {
result.push_back(matrix[j][rightX]);
}
if (rightY - leftY > 0)
for (i = rightX - 1; i >= leftX; i--) {
result.push_back(matrix[rightY][i]);
}
if (rightX - leftX > 0)
for (j = rightY - 1; j >= leftY + 1; j--) {
result.push_back(matrix[j][leftX]);
}
}
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> result;
if (matrix.empty()) return result;
int leftX = 0, leftY = 0;
int rightX = matrix[0].size() - 1;
int rightY = matrix.size() - 1;
while (leftX <= rightX && leftY <= rightY) {
print(matrix, result, leftX++, leftY++, rightX--, rightY--);
}
return result;
}
};
3、复杂度:
时间复杂度:O(mn),mn为矩阵所有元素;
空间复杂度:O(1)。
方法二:旋转法
1、思路:每次打印矩阵的第一行,然后将其删除,再把矩阵按逆时针旋转90度,重复上述过程可以完成求解。
2、代码:
class Solution {
public:
vector<vector<int> > turnMatrix(vector<vector<int> > matrix) {
int nrow = matrix.size();
int ncol = matrix[0].size();
vector<vector<int> > turnMat;
vector<int> row;
for (int i = ncol - 1; i >= 0; i--) {
for (int j = 0; j < nrow; j++) {
row.push_back(matrix[j][i]);
}
turnMat.push_back(row);
row.clear();
}
return turnMat;
}
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> result;
while (!matrix.empty()) {
result.insert(result.end(),matrix[0].begin(),matrix[0].end());
if (matrix.size() > 1)
matrix.erase(matrix.begin());
else break;
matrix = turnMatrix(matrix);
}
return result;
}
};
3、复杂度:
时间复杂度:O(mn(m+n)),不太确定,如果不对,请大佬指正;
空间复杂度:O(mn)。