题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
思路:
每次顺时针打印一圈,从外向内。每次开始一圈的地方都是matrix[i][i],所以重点是要确定外层循环结束的条件(i*2<row&&i*2<col)
printCircle函数实现打印特定的一圈,需要的参数是开始的位置和结束的位置,开始位置的行列相等(start),行结束位置endY=row-1-start(减1的原因是矩阵下标从0开始编号),列结束位置endX=col-1-start。在打印的时候分四步进行,往右,往下,往左,往上,但是需要进行这四步是有条件的。第一步往右总是需要的;第二步往下的条件是至少有两行(start<endY),开始位置是start+1;第三步往左的条件是至少两行且至少两列(start<endY && start<endX),开始位置是endX-1;第四部往上的条件是至少两列且至少三行( start<endX && start+1<endY),开始位置是endY-1,结束位置是start+1。
参考代码:
在线测试:
AC代码:
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> result;
if(matrix.empty())
return result;
int rows=matrix.size();
int cols=matrix[0].size();
for(int i=0;i*2<rows&&i*2<cols;i++)
{
printCircle(matrix, i, cols-i-1, rows-i-1, result);
}
return result;
}
void printCircle(vector<vector<int> > matrix, int start, int endX, int endY, vector<int> &result)
{
for (int i=start; i<=endX; i++)
{
result.push_back(matrix[start][i]);
}
if(endY>start)
{
for (int i=start+1; i<=endY; i++)
{
result.push_back(matrix[i][endX]);
}
}
if(start<endX && start<endY)
{
for (int i=endX-1; i>=start; i--)
{
result.push_back(matrix[endY][i]);
}
}
if(start<endX && start+1<endY)
{
for (int i=endY-1; i>=start+1; i--)
{
result.push_back(matrix[i][start]);
}
}
}
};