题目:
顺时针打印矩阵
链接:
https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a?tpId=13&tqId=11172&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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 class Solution{ 2 public: 3 vector<int> printMatrix(vector<vector<int>> matrix){ 4 int row = matrix.size(); // 行数 5 int col = matrix[0].size(); // 列数 6 int rl = 0,rh = row-1,cl = 0,ch = col-1; 7 vector<int> res; 8 while(rl <= rh && cl <= ch){ // 判断是否进行打印 9 printOut(matrix, res , rl, rh, cl ,ch); 10 ++rl; 11 --rh; 12 ++cl; 13 --ch; 14 } 15 return res; 16 } 17 void printOut(vector<vector<int>> &matrix,vector<int> &res, int rl,int rh,int cl,int ch){ 18 if(rl == rh && cl == ch) //判断是否只需要打印点 19 res.push_back(matrix[rl][cl]); 20 else if(rl == rh ){ //判断是否只需要打印列 21 for(int i =cl; i<= ch; ++i){ 22 res.push_back(matrix[rl][i]); 23 } 24 } 25 else if(cl == ch){ //判断是否只需要打印行 26 for(int i = rl; i <= rh ;++i){ 27 res.push_back(matrix[i][cl]); 28 } 29 } 30 else{ //打印矩阵环 31 for(int i = cl; i<= ch;++i){ 32 res.push_back(matrix[rl][i]); 33 } 34 for(int i = rl+1; i <= rh-1 ; ++i){ 35 res.push_back(matrix[i][ch]); 36 } 37 for(int i = ch ;i >= cl; --i){ 38 res.push_back(matrix[rh][i]); 39 } 40 for(int i = rh-1 ; i>= rl+1; --i){ 41 res.push_back(matrix[i][cl]); 42 } 43 } 44 } 45 };