剑指offer 20.顺时针打印矩阵

  1. 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
  2. 思路:
    1. 就像是打印回形针一样哈哈,减而治之的思路,设置一个范围lx rx  ty dy
    2. 每次从左到右,从上倒下,从右到左,从下到上
  3. 启发或者坑
    1. 回形针,最后只剩下一行或者一列的时候,应该进行特判【看可不可以处理特殊情况】
  4. 代码
    class Solution {
    public:
        vector<int> printMatrix(vector<vector<int> > matrix) {
            vector<int> res;
            int x = 0;
            int y = 0;
            int lx = 0;
            int ty = 0;
            int dy = matrix.size()-1;
            //矩阵为空特殊处理
            if (dy <0)
                return res;
            int rx = matrix[0].size()-1;
            while(lx <= rx && ty<=dy) {
                //cout << lx << " " << rx << " " <<endl;
                //cout << ty << " " << dy << " " <<endl;
                y = ty;
                x = lx;
                //这是走了一个回形针,如果只有一行或者只有一列呢
                for (x = lx; x < rx; x++)
                    res.push_back(matrix[y][x]);
                for (y = ty; y < dy; y++)
                    res.push_back(matrix[y][x]);
                if (ty == dy) {
                    res.push_back(matrix[y][rx]);
                    break;
                }
                for (x = rx; x > lx; x--)
                    res.push_back(matrix[y][x]);
                if (rx == lx) {
                    res.push_back(matrix[dy][rx]);
                    break;
                }
                for (y = dy; y > ty; y--)
                    res.push_back(matrix[y][x]);
                lx++;
                rx--;
                ty++;
                dy--;
            }
            return res;
        }
    };
发布了131 篇原创文章 · 获赞 5 · 访问量 7409

猜你喜欢

转载自blog.csdn.net/Alexia23/article/details/103842833