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