剑指offer第19题 顺时针打印矩阵 C++
顺时针打印矩阵
http://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
解析
- 直接处理矩阵:
(1)从左到右输出第一行
(2)从上到下输出最后一列
(3)从右到左输出最后一行
(4)从下到上输出第一列
(5)缩小矩阵,重复上述处理
技巧:使用4个变量left、right、top、bottom表示矩阵的左右上下边界,每次完成步骤1-4后缩小边界。
注意:应该在出现左右边界或上下边界相邻时结束循环,即right=left和top=bottom时结束循环。此时导致循环结束的情况有4种:剩下一行、剩下一列、剩下一个元素、已经完成,对四种情况进行判断即可。
代码:
vector<int> printMatrix(vector<vector<int>> matrix) { vector<int> result; if (matrix.empty()) result; int col, row, count; col = matrix.size(); row = matrix[0].size(); count = col * row; //矩阵的左右上下边界 int left, right, top, bottom; left = 0; right = row - 1; top = 0; bottom = col - 1; //每次循环打印一圈,仅剩下一行或一列时退出 while (left < right && top < bottom) { //left to right for (int i = left; i <= right; i++) { result.push_back(matrix[top][i]); count--; } //top to bottom for (int i = top + 1; i <= bottom; i++) { result.push_back(matrix[i][right]); count--; } //right to left for (int i = right - 1; i >= left; i--) { result.push_back(matrix[bottom][i]); count--; } //bottom to top for (int i = bottom - 1; i > top; i--) { result.push_back(matrix[i][left]); count--; } left++; top++; right--; bottom--; } //仅剩一列 if (left == right && top != bottom) { for (int i = top; i <= bottom; i++) { result.push_back(matrix[i][left]); count--; } } //仅剩一行 else if (left != right && top == bottom) { for (int i = left; i <= right; i++) { result.push_back(matrix[top][i]); count--; } } //仅剩一个元素 else if (count > 0) { result.push_back(matrix[left][top]); count--; } return result; }
- 旋转矩阵:
(1)输出原矩阵第一行
(2)删除原矩阵第一行
(3)逆时针旋转原矩阵
(4)重复上面3个步骤,直至矩阵为空
代码:
/*逆时针旋转矩阵*/ vector<vector<int>> rotationMatrix(vector<vector<int>> matrix) { if (matrix.empty()) return matrix; int col = matrix.size(); int row = matrix[0].size(); if (col * row == 1) return matrix; vector<vector<int>> result(row); for (int j = row - 1; j >= 0; j--) { for (int i = 0; i < col; i++) { result[row - 1 - j].push_back(matrix[i][j]); } } return result; }
/*主循环函数*/ vector<int> printMatrix(vector<vector<int>> matrix) { vector<int> result; while (1) { if (matrix.empty()) return result; int col = matrix.size(); int row = matrix[0].size(); vector<vector<int>> tmp(col - 1); //将第一行输出 for (int i = 0; i < row; i++) result.push_back(matrix[0][i]); //删去第一行 for (int i = 1; i < col; i++) { for (int j = 0; j <row; j++) { tmp[i - 1].push_back(matrix[i][j]); } } matrix = rotationMatrix(tmp); } }