力扣hot100——螺旋矩阵 超简单易懂的模拟搜索方法
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
解法思路:
// 模拟螺旋搜索设定四个边界
// left right
// top |————————————————|
// | |
// | |
// down |————————————————|
// 从左往右搜索,搜索完后向下,上边界下移
// 从上往下搜索,搜索完后向左,右边界左移
// 从右往左搜索,搜索完后向上,下边界上移
// 从下往上搜索,搜索完后向右,左边界右移
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
// 模拟螺旋搜索设定四个边界
// left right
// top |————————————————|
// | |
// | |
// down |————————————————|
// 从左往右搜索,搜索完后向下,上边界下移
// 从上往下搜索,搜索完后向左,右边界左移
// 从右往左搜索,搜索完后向上,下边界上移
// 从下往上搜索,搜索完后向右,左边界右移
vector<int> res;
int left = 0, right = matrix[0].size(),top = 0, down = matrix.size();
while(left < right && top < down){
// 从左往右搜索,搜索完后向下,上边界下移动
for(int i = left; i < right; i++){
res.push_back(matrix[top][i]); // 上边界行
}
++top;
if(top >= down){ // 只有一行
break;
}
// 从上往下搜索,搜索完后向左,右边界左移
for(int i = top; i < down; i++){
res.push_back(matrix[i][right-1]); // 外边界列
}
--right;
if(left >= right){ // 只有一列
break;
}
// 从右往左搜索,搜索完后向上,下边界上移
for(int i = right-1; i>=left;i--){
res.push_back(matrix[down-1][i]); // 下边界行加入
}
--down;
if(top >= down){ // 遍历结束
break;
}
// 从下往上搜索,搜索完后向右,左边界右移
for(int i = down-1; i>=top;i--){
res.push_back(matrix[i][left]); // 左边界列
}
++left;
if(left >= right){ // 遍历结束
break;
}
}
return res;
}
};