本文主要是介绍顺时针打印矩阵(剑指offer面试题29),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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)从下到上。
打印最内一圈有三种情况:(1)只需要第一步,(2)需要前两步,(3)需要走三步。
所以走第二步(从上到下)条件就是起始行号小于终止行号。
走第三步(从右到左)条件是 起始行号小于终止行号,起始列号小于终止列号。
走第四部(从下到上)条件是 终止行号至少比起始行号大2,起始列号小于终止列号
代码:
class Solution {
public:vector<int> printMatrix(vector<vector<int> > matrix) {vector<int> res;if (matrix.size() == 0) return res;int row = matrix.size();int col = matrix[0].size();int start = 0;int row_ori = row, col_ori = col;while (2 * start < row_ori && 2 * start < col_ori){printCircle(res, matrix, row, col, start);start++;/*row--;col--;*/ //与下面注释代码同步注释(运行时也一同运行)}return res;}void printCircle(vector<int>& res, vector<vector<int>> matrix, int row, int col, int start){/*for (int i = start, j = start; j< col; j++){res.push_back(matrix[i][j]);}for (int i = start + 1, j = col - 1; i<row; i++){res.push_back(matrix[i][j]);}if(row -start!= 1){for (int i = row - 1, j = col - 2; j >= start; j--){res.push_back(matrix[i][j]);}}if(col- start!=1){for (int i = row - 2, j = start; i>start; i--){res.push_back(matrix[i][j]);}}*///More concise solutionint endX = row - 1 - start;int endY = col - 1 - start;// left to rightfor(int i = start, j = start;j <= endY;j++){res.push_back(matrix[i][j]);}// up to downif(start < endX){for(int i = start+1, j = endY; i<=endX; i++){res.push_back(matrix[i][j]);}}// right to leftif(start< endX && start <endY){for(int i = endX, j = endY-1; j>=start; j--){res.push_back(matrix[i][j]);}}// down to upif(endX - start > 1 && start < endY)for(int i = endX-1, j = start; i>start; i-- ){res.push_back(matrix[i][j]);}}};
这篇关于顺时针打印矩阵(剑指offer面试题29)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!