列表

详情


OR38. 顺时针打印矩阵

描述

对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。

给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。

测试样例:
[[1,2],[3,4]],2,2
返回:[1,2,4,3]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 5ms, 内存消耗: 544KB, 提交时间: 2022-01-22

class Printer {
public:
    vector<int> clockwisePrint(vector<vector<int> > mat, int n, int m) 
    {
        vector<int>ret;
        int left = 0, right = m-1, bottom = n-1, top =0;
        
        while(true)
        {
            for(int i = left; i <= right; ++i) 
            {
                ret.push_back(mat[left][i]);
            }
            if(++top > bottom)
            {
                break;
            }
            
            for(int j = top; j <= bottom; ++j)
            {
                ret.push_back(mat[j][right]);
            }
            if(--right < left)
            {
                break;
            }
            
            for(int k = right; k >= left; --k)
            {
                ret.push_back(mat[bottom][k]);
            }
            if(--bottom < top)
            {
                break;
            }
            
            for(int n = bottom; n >= top; --n)
            {
                ret.push_back(mat[n][left]);
            }
            if(++left > right)
            {
                break;
            }
        }
        return  ret;
    }
};

C++ 解法, 执行用时: 6ms, 内存消耗: 532KB, 提交时间: 2022-02-03

class Printer {
public:
    vector<int> clockwisePrint(vector<vector<int> > mat, int n, int m) {
        // write code here
        vector<int> ret;
        int x1 = 0,y1 = 0;  //左上角坐标
        int x2 = n-1,y2 = m-1;  //右上角坐标
        //按照要求打印最外圈的数据,打印完后,缩小矩形的大小
        while(x1 <= x2 && y1 <= y2)
        {
            for(int j = y1; j <= y2; ++j)  //第一行
                ret.push_back(mat[x1][j]);
            for(int i = x1 + 1; i < x2; ++i)//最后一列 从第二个开始,不包括右下角数
                ret.push_back(mat[i][y2]);   
            for(int j = y2; x1 < x2 && j >= y1; --j) //最后一行
                ret.push_back(mat[x2][j]);  
            for(int i = x2-1; y1 < y2 && i > x1; --i)  //第一列
                ret.push_back(mat[i][y1]);
            x1++;
            y1++;
            x2--;
            y2--;
        }
        return ret;
    }
};

上一题