题目20:顺时针打印矩阵(leetcode链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/)
题目分析
顺时针打印矩阵,即按照从左向右->从上向下->从右向左->从下向上的顺序进行打印。如图:
我们可以循环的从四个方向进行打印,每个方向的打印可以分为:1)根据边界打印矩阵 2)边界-1 3)判断是否结束三个步骤。因此,每次打印时我们先判断打印的起始边界,打印完某一个行(列)时判断是否打印完毕。判断打印完毕的条件就是,当因这一行后判断将要打印的方向的开始边界是否小于等于结束边界。
代码描述
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ret;
if(matrix.size() == 0)
return ret;
//左右方向的边界
int left = 0,right = matrix[0].size();
//上下方向上的边界
int top = 1,down = matrix.size();
while(left <= right && top <= down)
{
//从左向右
for(int i = left;i < right;i++)
ret.push_back(matrix[top-1][i]);
right--;
//判断是否打印完毕
if(top >= down)
break;
//从上向下打印
for(int i = top;i < down;i++)
ret.push_back(matrix[i][right]);
down--;
if(left >= right)
return ret;
//从右向左
for(int i = right-1;i >= left;i--)
ret.push_back(matrix[down][i]);
left++;
if(top >= down)
return ret;
//从下向上
for(int i = down-1;i >= top;i--)
ret.push_back(matrix[i][left-1]);
top++;
if(left >= right)
break;
}
return ret;
}
};