【3】牛客网剑指offer——顺时针打印矩阵

题目描述:

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

 

解题思路:

这个题和刘汝佳《算法竞赛入门经典》中的一个题很像,那个题目要求给定一个方形矩阵的大小n,打印n x n大小的蛇形矩阵。这个题是给定一个固定大小的矩阵,按照蛇形顺序输出,算法思路基本一致,是一道模拟题,按照要求输入输出即可。

注意判定输出完成的条件是当打印的元素个数等于矩阵中元素的个数时,不再打印跳出循环,即可完成输出。

这个题的一个坑点是,当使用memset函数的时候非常耗时,memset一个1500*1500的矩阵需要15ms完成全部程序,而memset一个150*150的矩阵需要3ms。同时memset函数非常吃内存。

 

代码如下:

class Solution {
public:
    vector printMatrix(vector > matrix) {
        
        int row = matrix.size();//行数
        int col = matrix[0].size();//列数
        int num = row * col;//需要打印的元素总数
        
        int cnt = 0;//当前已经打印的元素数
        vector ans;
        
        int a[150][150] = {0};//判断这个元素是否被输出过
        //memset(a, 0, sizeof(a));
        
        int m = 0; //读取的行数
        int n = 0; //读取的列数
        
        ans.push_back(matrix[m][n]);
        cnt++;
        a[m][n] = 1;
        
        while (cnt < num){
            while (n+1 < col && a[m][n+1] == 0) {
                n++; 
                a[m][n] = 1; 
                ans.push_back(matrix[m][n]);
                cnt++;
            }
            while (m+1 < row && a[m+1][n] == 0){
                m++;
                a[m][n] = 1;
                ans.push_back(matrix[m][n]);
                cnt++;
            }
            while (n-1 >= 0 && a[m][n-1] == 0){
                n--;
                a[m][n] = 1;
                ans.push_back(matrix[m][n]);
                cnt++;
            }
            while (m-1 >= 0 && a[m-1][n] == 0){
                m--;
                a[m][n] = 1;
                ans.push_back(matrix[m][n]);
                cnt++;
            }
            
        }
        
        return ans;

    }
};

 

你可能感兴趣的:(算法题)