17,顺时针打印矩阵《剑指Offer》

题目:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.

思路:

四个方向遍历,每遍历一个方向那个方向的边 就去掉

注意的是:循环最后外面四个边的关系需要确定清楚

代码:

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> res;
        int top=0;
        int bottom=matrix.size()-1;
        
        int left=0;
        int right=matrix[0].size()-1;
 
        while(left<right&&top<bottom){
            //left--->right
            for(int i=left;i<=right;i++){
                res.push_back(matrix[top][i]);
            }
            top++;
            //top--->bottom
            for(int i=top;i<=bottom;i++){
                res.push_back(matrix[i][right]);
            }
            right--;
            //right--->left
            for(int i=right;i>=left;i--){
                res.push_back(matrix[bottom][i]);
            }
            bottom--;
            //bottom->top
            for(int i=bottom;i>=top;i--){
                res.push_back(matrix[i][left]);
            }
            left++;
        }
        //执行到这里只有几种情况:
        //1:left==right  top!=bottom  一列或没有
        //2:top==bottom  left!=right  一行或没有
        //left==right==top==bottom    只有一个
        if(left==right&&top!=bottom){
            for(int i=top;i<=bottom;i++){
                res.push_back(matrix[i][left]);
            }
        }
        if(top==bottom){
            for(int i=left;i<=right;i++){
                res.push_back(matrix[top][i]);
            }
        }
        return res;
    }
};

  

posted @ 2017-09-14 14:13  llauser  阅读(124)  评论(0编辑  收藏  举报