给你一个 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;}
};