题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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)从左至右,2)从上到下,3)从右到左,4)从下到上。
打印最内一圈有三种情况:(1)只需要第一步,(2)需要前两步,(3)需要走三步。
所以走第二步(从上到下)条件就是起始行号小于终止行号。
走第三步(从右到左)条件是 起始行号小于终止行号,起始列号小于终止列号。
走第四部(从下到上)条件是 终止行号至少比起始行号大2,起始列号小于终止列号
代码:
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> res;
if (matrix.size() == 0) return res;
int row = matrix.size();
int col = matrix[0].size();
int start = 0;
int row_ori = row, col_ori = col;
while (2 * start < row_ori && 2 * start < col_ori)
{
printCircle(res, matrix, row, col, start);
start++;
/*row--;
col--;*/ //与下面注释代码同步注释(运行时也一同运行)
}
return res;
}
void printCircle(vector<int>& res, vector<vector<int>> matrix, int row, int col, int start)
{
/*
for (int i = start, j = start; j< col; j++)
{
res.push_back(matrix[i][j]);
}
for (int i = start + 1, j = col - 1; i<row; i++)
{
res.push_back(matrix[i][j]);
}
if(row -start!= 1)
{
for (int i = row - 1, j = col - 2; j >= start; j--)
{
res.push_back(matrix[i][j]);
}
}
if(col- start!=1)
{
for (int i = row - 2, j = start; i>start; i--)
{
res.push_back(matrix[i][j]);
}
}*/
//More concise solution
int endX = row - 1 - start;
int endY = col - 1 - start;
// left to right
for(int i = start, j = start;j <= endY;j++)
{
res.push_back(matrix[i][j]);
}
// up to down
if(start < endX)
{
for(int i = start+1, j = endY; i<=endX; i++)
{
res.push_back(matrix[i][j]);
}
}
// right to left
if(start< endX && start <endY)
{
for(int i = endX, j = endY-1; j>=start; j--)
{
res.push_back(matrix[i][j]);
}
}
// down to up
if(endX - start > 1 && start < endY)
for(int i = endX-1, j = start; i>start; i-- )
{
res.push_back(matrix[i][j]);
}
}
};