一.题目描述
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) 需要用二维数组来储存结果
优缺点:比较难实现 但是相比之下在时间和空间上比较优

京公网安备 11010502036488号