Leetcode典型题解答和分析、归纳和汇总——T54(螺旋矩阵)

题目描述:

给定一个包含m*n个元素的矩阵(m行n列),请按照顺时针螺旋旋转顺序,返回矩阵中的所有元素。

题目解析:本题没有明显的捷径可以来处理,一般是使用数组操作,设定好遍历的边界,然后在进行方向的规定。

解法1:思路清晰,而且运用了方向数组的概念,但是时间运行比较久。

class Solution{
   public:
   vector<int> spiralOrder(vector<vector<int>>& matrix){
      vector<int> result;
      if(matrix.size()==0) return result; //如果矩阵为空,则返回空值
      //获取数组最终需要填充的个数,即返回数组的长度
      int size = matrix.size()*matrix[0].size();
      //定义四个方向
      int direct[2][4]={{0,1,0,-1},{1,0,-1,0}};
      int nextx,nexty,der,curx,cury;
      //定义当前位置和方向
      curx=cury=der=0;
      //直到填充数组结束
      while(result.size()<size)
      {
          //如果当前元素没有被访问过
          if(matrix[curx][cury]!=INT_MAX)
          {
              result.push_back(matrix[curx][cury]); //将当前值保存在result数组中
              matrix[curx][cury]=INT_MAX; //赋值为最大,表示访问过了
          }

          //获取下一个元素
          nextx=curx+direct[0][der];
          nexty=nexty+direct[1][der];
          //判断下一个元素是否符合要求:没有越界,也没有访问过
          if(nextx>=0&&nextx<matrix.size()&&nexty>=0&&nexty<matrix[0].size()&&matrix[nextx][nexty]!=INT_MAX)
          {
              curx=nextx;
              cury=nexty;
          }
          else  der = (der+1)%4;  //不符合要求,则进行转向
      }
      return result;
   }
};

解法2:直接采用while循环来实现,当左右或者上下边界超出界限范围时,则进行重新规划。

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;
    }
};
发布了56 篇原创文章 · 获赞 7 · 访问量 4466

猜你喜欢

转载自blog.csdn.net/weixin_44504987/article/details/104407885