题目来源:牛客网
编程连接
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
解析:
题目很简单,代码实现需要注意很多细节,对for的使用需要很在意。初始化和边界条件的改变。
设置up,down,left,right,四个边界
每一次都打印完一圈之后,x++,y++,初始值在保持矩阵对角线上。left+1也是在走完一圈后更新matrix[x][y]..
* 从左往右走,y++,
* 从上往下走,需要把up+1;
* 从右往左走,则把right-1;
* 从下往上走,需要把down-1;
* 每次循环开始,都需要考虑初始化。
解答:
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> ret;
for (int x = 0, y = 0, up = 0, down = matrix.size() - 1, left = 0, right = matrix[0].size() - 1;
left <= right && up <= down; ++y, ++x, ++left) {
for (; left <= right && up <= down && y <= right; ret.push_back(matrix[x][y++]));
for (++x, --y, ++up; left <= right && up <= down && x <= down; ret.push_back(matrix[x++][y]));
for (--y, --x, --right; left <= right && up <= down && y >= left; ret.push_back(matrix[x][y--]));
for (--x, ++y, --down; left <= right && up <= down && x >= up; ret.push_back(matrix[x--][y]));
}
return ret;
}
};
更清晰和容易理解的版本
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
if (matrix.empty()) return {};
int m = matrix.size(), n = matrix[0].size();
vector<int> spiral(m * n);
int u = 0, d = m - 1, l = 0, r = n - 1, k = 0;
while (true) {
for (int col = l; col <= r; col++) spiral[k++] = matrix[u][col];
if (++u > d) break;
// right
for (int row = u; row <= d; row++) spiral[k++] = matrix[row][r];
if (--r < l) break;
// down
for (int col = r; col >= l; col--) spiral[k++] = matrix[d][col];
if (--d < u) break;
// left
for (int row = d; row >= u; row--) spiral[k++] = matrix[row][l];
if (++l > r) break;
// up
}
return spiral;
}
};