题解
/ 顺时针打印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]);
}
}
难点
- 使用两点坐标来确定矩形
- 边界条件的控制