顺时针打印矩阵
2019-07-29 本文已影响0人
HamletSunS
思路:
- 可以先画个图,自己模拟一下,有个直观感受,然后找一找规律
- 要求顺时针打印,只要行数和列数>=1即可满足打印条件,可以直接通过4个变量保存好上下左右的边界,可以发现每顺时针遍历一圈,上下左右的边界会向内推进1,直到 上边界的行号大于下边界的行号 或者 左边界的列位于有边界的列的右侧,说明打印完成。再通俗些说,当边界围成的范围只有一行或一列时,就是最后一次打印了。
- 按照顺时针顺序打印,那么有:
- 从左到右,只要左边界小于等于右边界即可打印
- 从上到下,只要上边界小于下边界即可打印
- 从右到左,首先比较明显的条件是左边界小于右边界,但我们要注意在步骤1中我们已经打印了一行,所以再次横向打印时我们还应该保证跟步骤1打印的不是同一行。不是同一行的话就要求步骤2执行,因此想执行步骤3还需要满足步骤2的条件。
简单来说,从右到左打印的条件是左边界小于右边界(因为要横向打印)和上边界小于下边界(保证跟1打印的不是同一行) - 从下到上打印,分析同3,可以知道也需要满足2个条件才可以执行打印,这2个条件是上边界小于下边界,左边界小于有边界
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> ret;
int row=matrix.size();
if(row==0)
return ret;
int col=matrix[0].size();
if(col==0)
return ret;
int left=0,right=col-1,top=0,bottom=row-1;
while(left<=right && top<=bottom){
//left -> right
for(int i=left;i<=right;++i)
ret.push_back(matrix[top][i]);
//top->bottom
for(int i=top+1;i<=bottom;i++)
ret.push_back(matrix[i][right]);
//right->left
if(top<bottom){
for(int i=right-1;i>=left;i--)
ret.push_back(matrix[bottom][i]);
}
//bottom->top
if(left<right){
for(int i=bottom-1;i>=top+1;i--)
ret.push_back(matrix[i][left]);
}
left++;
right--;
top++;
bottom--;
}
return ret;
};
};