vector<int> printMatrix(vector<vector<int> > matrix) {
int matrix_size_x = matrix.size();
int matrix_size_y = matrix[0].size();
vector<int> result;
for(auto size_x = matrix_size_x, size_y = matrix_size_y; size_x > 0 && size_y > 0; size_x -= 2, size_y -= 2) {
int begin_x = (matrix_size_x - size_x) / 2;
int begin_y = (matrix_size_y - size_y) / 2;
for(auto y = begin_y; y < begin_y + size_y; y++){
result.push_back(matrix[begin_x][y]);
}
for(auto x = begin_x + 1; x < begin_x + size_x - 1; x++){
result.push_back(matrix[x][begin_y + size_y - 1]);
}
// 这里使用size_type定义y出现了一个问题,反向遍历的时候到0再-1不会变成-1,因为size_type是一个无符号数,导致无法退出循环
// 如果行数为奇数,只剩最后一行时会打印两次,加上size_x != 1来阻止
for(auto y = begin_y + size_y - 1; y >= begin_y && size_x != 1; y--){
result.push_back(matrix[begin_x + size_x - 1][y]);
}
// size_y != 1 与上同理
for(auto x = begin_x + size_x - 2; x > begin_x && size_y != 1; x--){
result.push_back(matrix[x][begin_y]);
}
}
return result;
}
思路:每次打印矩阵的一圈 4x4的矩阵先打印外圈变2x2然后接着打印 5x5的打印一圈变3x3再打印一圈变1x1
需要注意的地方是奇数的行列到最后一行/列时候需要防止打印两次
另外一点是如果使用vector<int>::size_type 定义x和y,逆序打印的时候会出现y减小到0但是不能退出循环的情况,因为size_type是无符号数,0-1并不会变成-1.所以使用int没有使用size_type

京公网安备 11010502036488号