ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【剑指Offer-画图让抽象问题形象化】面试题29:顺时针打印矩阵

2020-03-11 22:07:36  阅读:197  来源: 互联网

标签:面试题 rows matrix Offer int 矩阵 29 cols start


题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

思路

将矩阵按照从外向里以顺时针的顺序依次打印出每一个数字,就是从外向里一圈一圈地打印数字。例如,对上面的矩阵来说,矩阵形状为4x4,共打印2圈:第一圈起始于坐标(0,0),值为1;第二圈起始于坐标(1,1),值为6. 对一个5x5的矩阵来说,最内一圈起始点为(2, 2),对于一个6x6的矩阵来说,最内一圈的起点为(2,2)。我们发现当rows>start*2并且cols>start*2时循环结束,其中,rows,cols为矩阵的行列数,start为起始位置。

如上图所示,顺时针打印一圈分为4个步骤,但只有第1步从左到右横向打印是必须的,其他3步都不是必须的。当至少有两行,也就是终止行号大于起止行号的时候才需要第2步;当至少有两行两列时,也就是终止行号大于起止行号并且终止列号大于起止列号的时候才需要第3步;当终止行号比起始行号大于1并且起始列号大于终止列号时,才需要第4步。代码如下:

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        if(matrix.empty()){
            cout<<"";
            vector<int> empty;
            return empty;
        }
        
        int rows = matrix.size();
        int cols = matrix[0].size();
        
        int start = 0;
        vector<int> ans;
        while(rows>start*2 && cols>start*2){
            circle(matrix, rows, cols, start, ans);
            start++;
        }
        
        for(int i=0; i<ans.size(); i++){
            if(i==0)
                cout<<ans[i];
            else cout<<","<<ans[i];
        }
        return ans;
    }
    
    void circle(vector<vector<int> > matrix, int rows, int cols, int start, vector<int>& ans){
        int endRow = rows-1-start;
        int endCol = cols-1-start;
        
        for(int i=start; i<=endCol; i++)
            ans.push_back(matrix[start][i]);
        
        if(endRow-start>0){
            for(int i=start+1; i<=endRow; i++)
                ans.push_back(matrix[i][endCol]);
            if(endCol-start>0){
                for(int j=endCol-1; j>=start; j--)
                    ans.push_back(matrix[endRow][j]);
                if(endRow-start>1){
                    for(int k=endRow-1; k>start; k--)
                        ans.push_back(matrix[k][start]);
                }
            }
        }
    }
};

标签:面试题,rows,matrix,Offer,int,矩阵,29,cols,start
来源: https://www.cnblogs.com/flix/p/12465805.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有