zoukankan      html  css  js  c++  java
  • 54. 螺旋矩阵

    题目描述

    给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

    示例 1:

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

    示例 2:

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

    算法

    外一层,里一层的递归插入要返回的向量中。
    执行递归插入操作的函数是void insert_to_vec(vector<vector<int>>& matrix, int left_top_row, int left_top_col, int right_bottom_row, int right_bottom_col)
    它包含5个参数:
    1. 矩阵
    2. 左上角的行
    3. 左上角的列
    4. 右下角的行
    5. 右下角的列
    left_top_row > right_bottom_row || left_top_col > right_bottom_col是递归的中止条件,
    left_top_row == right_bottom_rowleft_top_col == right_bottom_col是特殊边界,
    整个插入按照左上到右上,右上到右下,右下到左下,左下到左上的流程走完,
    然后进行里一层的插入,即调用insert_to_vec(matrix, left_top_row+1, left_top_col+1, right_bottom_row-1, right_bottom_col-1); .

    代码

    class Solution {
    public:
        // 这是要返回的答案
        vector<int> ansVec;
        vector<int> spiralOrder(vector<vector<int>>& matrix) {
            // row是矩阵的行数
            int row = matrix.size();
            
            if (row == 0)
                return ansVec;
            
            if (row == 1)
                return matrix[0];
            
            // col是矩阵的列数
            int col = matrix[0].size();
            
            if (col == 1)
            {
                for (int j = 0; j < row; j++)
                    ansVec.push_back(matrix[j][0]);
                return ansVec;
            }
            
            insert_to_vec(matrix, 0, 0, row-1, col-1);
            return ansVec;
        }
        
        void insert_to_vec(vector<vector<int>>& matrix, int left_top_row, int left_top_col, int right_bottom_row, int right_bottom_col)
        {
            if (left_top_row > right_bottom_row || left_top_col > right_bottom_col)
                return;
            
            if (left_top_row == right_bottom_row)
            {
                for (int i = left_top_col; i <= right_bottom_col; i++)
                    ansVec.push_back(matrix[left_top_row][i]);
                return;
            }
            
            if (left_top_col == right_bottom_col)
            {
                for (int i = left_top_row; i <= right_bottom_row; i++)
                    ansVec.push_back(matrix[i][left_top_col]);
                return;
            }
            
            for(int i = left_top_col; i <= right_bottom_col; i++)
                ansVec.push_back(matrix[left_top_row][i]);
            
            for(int i = left_top_row + 1; i <= right_bottom_row; i++)
                ansVec.push_back(matrix[i][right_bottom_col]);
            
            for(int i = right_bottom_col - 1; i >= left_top_col; i--)
                ansVec.push_back(matrix[right_bottom_row][i]);
            
            for(int i = right_bottom_row - 1; i > left_top_row; i--)
                ansVec.push_back(matrix[i][left_top_col]);
            
            insert_to_vec(matrix, left_top_row+1, left_top_col+1, right_bottom_row-1, right_bottom_col-1);
        }
    };
    
  • 相关阅读:
    支付清结算之基本概念和入门
    支付清结算之账户和账务处理
    支付系统设计:支付系统的账户模型(一)
    Docker架构和原理
    Docker容器的原理、特征、基本架构、与应用场景
    Docker的用途与原理
    Random函数的安全性问题与SecureRandom
    nginx配置https
    CentOS Docker 安装
    Nginx能做什么
  • 原文地址:https://www.cnblogs.com/shayue/p/10360865.html
Copyright © 2011-2022 走看看