【LeetCode】54. 螺旋矩阵 不用记录所走路径而是需要判断当前方向结束后是否还可以继续

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

示例 1:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
通过次数62,020提交次数153,619

自己的写法

用flag位来控制上下左右

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
    vector<int> res;
     if(matrix.size()==0) return res;
    int cols=matrix[0].size();
    int rows=matrix.size();
    
    if(rows==1) return matrix[0];
   
    int col=0;
    int row=0;
    int circle=0;
    bool right=true,left=false,down=false,up=false;

    for(int i=0;i<cols*rows;){
        if(right){
            if(col<cols-circle){
                res.push_back(matrix[row][col]);
                col++;
                i++;
            }
            else{
                col--;
                row++;
                right=false;
                down=true;
            }
        }
        else if(down){
            if(row<rows-circle){
                res.push_back(matrix[row][col]);
                row++;
                i++;
            }
            else{
                row--;
                col--;
                left=true;
                down=false;
            }
        }
        else if(left){
            if(col>=0+circle){//
                res.push_back(matrix[row][col]);
                col--;
                i++;
            }
            else{
                col++;
                row--;//
                left=false;
                up=true;
            }

        }
        else if(up){
            if(row>=1+circle){//
                res.push_back(matrix[row][col]);
                row--;
                i++;
            }
            else{
                row++;
                col++;//
                up= false;
                right=true;
                circle++;
            }
        }
    }
    return res;
}
};

事实上并不需要用flag位来判定 而是直接判断上边界有没有超过下边届 左边界有没有超过右边届

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
    vector<int> res;
     if(matrix.size()==0) return res;
    int cols=matrix[0].size();
    int rows=matrix.size();
    
    if(rows==1) return matrix[0];
   
   
    int right=cols-1,left=0,down=rows-1,up=0;

    while(true){
        for(int i=left;i<=right;i++) res.push_back(matrix[up][i]);
        if(++up>down) break;
        for(int i=up;i<=down;i++)  res.push_back(matrix[i][right]);
        if(--right<left) break;
        for(int i=right;i>=left;i--) res.push_back(matrix[down][i]);
        if(--down<up) break;
        for(int i=down;i>=up;i--) res.push_back(matrix[i][left]);
        if(++left>right) break;
    }
return res;
 

    return res;
}
};

你可能感兴趣的:(LeetCodes刷题之路)