题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如矩阵为
,
输出后的结果为[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]
解法:
1、求取数组的row和col ,利用循环,每次输出一个圆 来逐次输出所有数据。
初始化circleNum=0,那么每一圈开始位置为matrix[circleNum][circleNum],即第一圈开始的位置在数组中的索引。
我们可以发现规律,循环的终止条件为 col >circleNum*2 && row>circleNum*2
2、以如下四步的方式画一个完整的圈。
每一步都有运行的条件假设每一圈的最后一行的坐标为endY = row -1 - circleNum;,
每一圈最后一列的坐标为 endX = col -1 - circleNum分析可得:
第一步一定会运行
第二步运行的条件是endY>circleNum,即当前圈的最后一行的行号要大于起始行。
第三步运行的条件是endY>circleNum && endX>circleNum,即当前圈的最后一行的行号要大于起始行,当前圈的最后一列 列号要大于起始列的列号。
第四步运行条件是endY>circleNum+1 && endX>circleNum。
代码如下
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> res;
if(matrix.empty())
return res;
int circleNum = 0;
int row = matrix.size();
int col = matrix[0].size();
while(row>2*circleNum && col>2*circleNum) //循环画圈
{
oneCircle(matrix,res,row,col,circleNum);
circleNum++;
}
return res;
}
void oneCircle(vector<vector<int>> &matrix ,vector<int> &res,int row,int col,int circleNum)
{
int endX = col-1-circleNum; //每一圈的终止列
int endY = row -1 - circleNum; //每一圈的终止行
for(int i = circleNum;i<=endX;i++) //第一步一定会进行
res.push_back(matrix[circleNum][i]);
if(endY > circleNum) //第二步的进行条件
{
for(int i = circleNum+1;i<=endY;i++)
res.push_back(matrix[i][endX]);
}
if(endX > circleNum && endY >circleNum)//第三步
{
for(int i =endX-1;i>=circleNum;i--)
res.push_back(matrix[endY][i]);
}
if(endY >circleNum+1 && endX >circleNum)//第四步
{
for(int i = endY-1;i>=circleNum+1;i--)
res.push_back(matrix[i][circleNum]);
}
}