题解 | #顺时针打印矩阵#

顺时针打印矩阵

https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a

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
#剑指offer#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务