一.题目描述
NC38螺旋矩阵
题目链接:https://www.nowcoder.com/practice/7edf70f2d29c4b599693dc3aaeea1d31tpId=196&&tqId=37072&rp=1&ru=/activity/oj&qru=/ta/job-code-total/question-ranking
给定一个m*n大小的矩阵,按螺旋的顺序返回矩阵中的所有元素。
二.算法(利用python进行模拟)
首先介绍python的几个函数:
(1)list: list() 方法用于将元组转换为列表。
注:元组与列表是非常类似的,区别在于元组的元素值不能修改,元组是放在括号中,列表是放于方括号中。
(2)zip: 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
(3)[1:]: 表示元组的一个元素可以是一个元组,也可以是一个数。
(4)[::-1]: 对元组进行变换,类似于逆时针旋转。
图片说明
下面给代码:

class Solution:
    def spiralOrder(self , matrix ):
        res = []
        while matrix:
            res += matrix[0]
            matrix = list(zip(*matrix[1:]))[::-1]//每次取出来第一行,然后对剩下yuan
        return res

时间复杂度:O(n * m)其中n,m分别表示矩阵的行数和列数
空间复杂度:O(1) 不需要额外开辟空间
优缺点:代码什么简洁,方便实现,但是不能锻炼能力
三.算法(模拟)
图片说明
对于每层,从左上方开始以顺时针的顺序遍历所有元素。假设当前层的左上角位于(up,left),右下角位于(down,right),按照如下顺序遍历当前层的元素。
从左到右遍历上侧元素,依次为(up,left)到(up,right)。
从上到下遍历右侧元素,依次为(up+1,right+1)到(down,right)。
如果left<right且up<down,则从右到左遍历下侧元素,依次为(down,right-1)到(down,left+1),以及从下到上遍历左侧元素,依次为(down,left)到(up+1,left)。
遍历完当前层的元素之后,将up和down分别增加,将right和left分别减少,进入下一层继续遍历,直到遍历完所有元素为止。
图片说明

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if (matrix.size() == 0 || matrix[0].size() == 0) {
            return {};
        }
        int x=matrix.size();
        int y=matrix[0].size();
        vector<int>ans;
        int left=0,right=y-1,top=0, bottom=x-1;
        while (left<=right&&top<=bottom) {
            for (int column=left;column<=right;column++) {//左右遍历
                ans.push_back(matrix[top][column]);
            }
            for (int row=up+1;row<=bottom;row++) {//上下遍历
                ans.push_back(matrix[row][right]);
            }
            if (left<right&&top<bottom) {
                for (int column=right-1;column>left;column--) {
                    ans.push_back(matrix[bottom][column]);
                }
                for (int row=bottom;row>top;row--) {
                    ans.push_back(matrix[row][left]);
                }
            }
            left++;
            right--;
            top++;
            bottom--;
        }
        return ans;
    }
};

时间复杂度:O(n * m) n,m分别表示矩阵的行数和列数
空间复杂度:O(n * m) 需要用二维数组来储存结果
优缺点:比较难实现 但是相比之下在时间和空间上比较优