剑指 Offer 29. 顺时针打印矩阵

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

 

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

 

限制:

  • 0 <= matrix.length <= 100
  • 0 <= matrix[i].length <= 100

很简单,但还是有要注意的点:

这个矩阵的行数和列数未必相等!从第二个样例可以看出来。

需要元素总数来判断是否吧所有元素添加到结果中。

遍历矩阵需要用到行数和列数,要区分好m和n。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int cnt = 0, level = 0;
        if(matrix.size() == 0) return {};
        int n = matrix.size(), m = matrix[0].size();
        int count = n*m;
        
        vector<int> ans(count);
        
        while(cnt < count){
            for(int j=0+level; j<m-level && cnt<count; j++){
                ans[cnt++] = matrix[0+level][j];
            }
            for(int i=1+level; i<n-level && cnt<count; i++){
                ans[cnt++] = matrix[i][m-1-level];
            }
            for(int j=m-2-level; j>=0+level && cnt<count; j--){
                ans[cnt++] = matrix[n-1-level][j];
            }
            for(int i=n-2-level; i>=1+level && cnt<count; i--){
                ans[cnt++] = matrix[i][0+level];
            }
            level++;
        }
        
        
        return ans;

    }
};

我的算法上升空间还很大,今天面试变形二分没撕出来。继续努力吧,项目业务关还是很有信心的,可惜了算法题了。

好在offer在手,接下来也不慌。

posted @ 2021-06-23 23:11  深圳地铁Princess  阅读(36)  评论(0编辑  收藏  举报