0
点赞
收藏
分享

微信扫一扫

NC38 螺旋矩阵 牛客题霸

冶炼厂小练 2022-03-30 阅读 59
算法c++
  • 模拟题,注意越界啊!

在这里插入图片描述


class Solution {
  public:
    vector<int> spiralOrder(vector<vector<int> >& matrix) {
        // 简单模拟
        int m = matrix.size(); // 行
        
        vector<int> C;
        
        if (m == 0) return C;
        
        int n = matrix[0].size();// 列
        int sum = m * n; // 总的元素个数
//         右 下 左 上 螺旋走 四个边界
        int right = n - 1;
        int down = m - 1;
        int left = 0;
        int up = 0;
        int i = 0; // 存储数组的量
        int idx = 0; // 当前走到的矩阵元素
        
        
        // 记得每次要刷新一下边界,因为存完之后,会减少
        while (1) {
//             四个方向如何走
            // 从左往右走
            for (idx = left; idx <= right; idx++) {
                C.push_back(matrix[up][idx]);
                i++;
            }
            up++;
            if (i >= sum) break; // 若是超过总的个数,就停止了
            
            // 从上往下走
            for (idx = up; idx <= down; idx++) {
                C.push_back(matrix[idx][right]);
                i++;
            }
            right--;
            if (i >= sum) break; // 若是超过总的个数,就停止了
            
            // 从右向左走
            for (idx = right; idx >= left; idx--) {
                C.push_back(matrix[down][idx]);
                i++;
            }
            down--;
            if (i >= sum) break; // 若是超过总的个数,就停止了
            
            // 从下往上走
            for (idx = down; idx >= up; idx--) {
                C.push_back(matrix[idx][left]);
                i++;
            }
            left++;
            if (i >= sum) break; // 若是超过总的个数,就停止了
        }
        
        return C;
    }
};
举报

相关推荐

0 条评论