前言
中等 √ 设定四个边界,按边遍历同时更新边界。
题目
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
思路
设定四个边界,按边遍历同时更新边界。上边界->右,右边界->下,下边界->左,左边界->上。
我的题解
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
int left = 0, right = n-1, up = 0, down = m-1;
int row = 0, col = 0;
vector<int> ans;
while(ans.size() < m*n){
//上边界->右,右边界->下,下边界->左,左边界->上
if (row == up && ans.size() < m*n){
while (col < right){
ans.push_back(matrix[row][col]);
col++;
}
ans.push_back(matrix[row][col]);
row++;
up++;
}
if (col == right && ans.size() < m*n){
while (row < down){
ans.push_back(matrix[row][col]);
row++;
}
ans.push_back(matrix[row][col]);
col--;
right--;
}
if (row == down && ans.size() < m*n){
while (col > left){
ans.push_back(matrix[row][col]);
col--;
}
ans.push_back(matrix[row][col]);
row--;
down--;
}
if (col == left && ans.size() < m*n){
while (row > up){
ans.push_back(matrix[row][col]);
row--;
}
ans.push_back(matrix[row][col]);
col++;
left++;
}
}
return ans;
}
};
官方题解
第一种是额外创建一个矩阵记录每个位置是否被遍历,第二种思路与笔者一致,不赘述。
心得
这个题目思路简单,不过总感觉别人写的比我优雅简洁,实际上思路一样的。但这样就真的好么?私信觉得可读性没我的强,anyway,还是继续学习吧~
1253

被折叠的 条评论
为什么被折叠?



