LeetCode/螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素
1. 模拟操作(贪吃蛇不断更改方向)
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
int m = matrix.size();int n = matrix[0].size();
vector<vector<int>> dir =
{{0,1},{1,0},{0,-1},{-1,0}};
int x = 0; int y = 0;
int index = 0;int count = 0;
while(1){
res.push_back(matrix[x][y]);
matrix[x][y] = 101;//锁住
if(++count==m*n) return res;
//试探
int subx = x + dir[index%4][0];
int suby = y + dir[index%4][1];
if(subx==-1|suby==-1||subx==m||suby==n||matrix[subx][suby]==101)
index++;//改变方向
x = x + dir[index%4][0];
y = y + dir[index%4][1];
}
return res;
}
};
2. 模拟更改边界
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector <int> ans;
if(matrix.empty()) return ans; //若数组为空,直接返回答案
int u = 0; //赋值上下左右边界
int d = matrix.size() - 1;
int l = 0;
int r = matrix[0].size() - 1;
while(true)
{
for(int i = l; i <= r; ++i) ans.push_back(matrix[u][i]); //向右移动直到最右
if(++ u > d) break; //重新设定上边界,若上边界大于下边界,则遍历遍历完成,下同
for(int i = u; i <= d; ++i) ans.push_back(matrix[i][r]); //向下
if(-- r < l) break; //重新设定有边界
for(int i = r; i >= l; --i) ans.push_back(matrix[d][i]); //向左
if(-- d < u) break; //重新设定下边界
for(int i = d; i >= u; --i) ans.push_back(matrix[i][l]); //向上
if(++ l > r) break; //重新设定左边界
}
return ans;
}
};
Python削水果
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res = []
while matrix:
# 削头(第一层)
res += matrix.pop(0)
# 将剩下的逆时针转九十度,等待下次被削
matrix = list(zip(*matrix))[::-1]
return res
3. 螺旋矩阵II(模拟更改边界)
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n));
int u = 0; //赋值上下左右边界
int d = n - 1;
int l = 0;
int r = n - 1;
int num = 1;
while(true)
{
for(int i = l; i <= r; ++i) res[u][i] = num++;//向右移动直到最右
if(++ u > d) break; //重新设定上边界,若上边界大于下边界,则遍历遍历完成,下同
for(int i = u; i <= d; ++i) res[i][r]= num++; //向下
if(-- r < l) break; //重新设定有边界
for(int i = r; i >= l; --i) res[d][i]= num++; //向左
if(-- d < u) break; //重新设定下边界
for(int i = d; i >= u; --i) res[i][l]= num++; //向上
if(++ l > r) break; //重新设定左边界
}
return res;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了