0 题目
1 分析
首先,将一个圆圈,看作是一次循环,那么第一次循环其实坐标为0,0
当打印完以后,还能在打印的时候,起始坐标为1,1,往后依次为2,2
因此可以使用一个变量来表示起始坐标,start
每当循环依次,那么数组上下左右四个边界都-1。表示已经打印过了
当start大于总的列数/2+1,或是大于总的行数/2+1的时候,表示不能打印了
比如有5列,7行。start=1的时候可以打印,3的时候也可以,但是4的时候就不行了。因为该列已经被打印过了。
同时可以有start和rows和cols,计算上下左右四个打印边界(可以打印到的)。
然后左到右,直接start小于等于右边界即可
上到下,start+1小于等于下边界。
右到左,start+1应该小于等于下边界
下到上,start应该大于下边界-1
vector<int> printMatrix(vector<vector<int>> matrix)
{
vector<int> res;
int rows = matrix.size();
int cols = matrix[0].size();
int start = 0; // start是每次开始打印时候,xy的坐标,x=y
while (rows > start * 2 && cols > start * 2)
{
int i = 0;
// 下面两个值,是本次打印的右边界和下边界.可以到达的边界
int endX = cols - start - 1;
int endY = rows - start - 1;
// 左->右,只要 start <= 右边界,就可以打印
for (i = start; i <= endX; i++)
{
res.push_back(matrix[start][i]);
}
// 上->下,因为左->右最后打印的那个数,也可以看作是,上->下的第一个数
// 而这个数已经打印过一次了,所以就跳过这个数。因此是start+1
for (i = start + 1; i <= endY; i++)
{
res.push_back(matrix[i][endX]);
}
// 右->左,此时需要判断,是否只有一层,如果只有一层,那么在 左->右 已经打印过一次了
// 因此 start 必须要大于 endY
if (start < endY)
{
// 从 endx-1 是因为,从上到下的时候,打印了一个
for (i = endX - 1; i >= start; i--)
{
res.push_back(matrix[endY][i]);
}
}
// 下->上,也需要满足上下有多层,左右也有多层。
// start < endX 保证了,左右是有空间的
if (start < endX && start < endY - 1)
{
// 从 endY - 1 开始,是应为 在从右到左的时候已经打印了它的第一个树
for (i = endY - 1; i > start; i--)
{
res.push_back(matrix[i][start]);
}
}
// 依次循环后,yx的值,要递增,因此start++
start++;
}
return res;
}