题解

/ 顺时针打印2D数组
        vector<int> printMatrix(vector<vector<int> > matrix) {
            // 初始化:给定一个矩阵matrix
            // 定义print_right, print_down, print_left, print_up四个方法
            // 从外向内,依次按照顺时针打印,直到层(lower(n/2)+1)打印完毕
            // 用左上角和右下角的坐标唯一确定一个矩阵
            vector<int> ret;
            if (matrix.empty()) return ret;  // 养成好习惯,开头判断输入
            int lx = 0, ly = 0;
            int rx = matrix.size()-1, ry = matrix[0].size() -1;
            while(lx<=rx && ly <= ry){
                print(lx++, ly++, rx--, ry--, matrix, ret);
            }

            return ret;
        }

        void print(int lx, int ly, int rx, int ry, vector<vector<int>> &matrix, vector<int> &ret){
            // print_right
            for (int j=ly; j<=ry;++j) ret.push_back(matrix[lx][j]);
            // print_down
            for (int i = lx+1;i<=rx;++i) ret.push_back(matrix[i][ry]);
            int h = rx-lx+1;
            if (h>1){  // 只有一行,不需要这一步
                // print_left
                for(int rj = ry-1;rj>=ly;--rj) ret.push_back(matrix[rx][rj]);
            }
            int w = ry - ly +1;
            if (w>1){  // 只有1列不需要这一步
                for (int ri=rx-1;ri>=lx+1;--ri) ret.push_back(matrix[ri][ly]);
            }
        }

难点

  1. 使用两点坐标来确定矩形
  2. 边界条件的控制