力扣算法篇:螺旋矩阵

力扣算法篇:螺旋矩阵

螺旋矩阵:给你一个m行n 列的矩阵matrix ,请按照顺时针螺旋顺序,返回矩阵中的所有元素。
实例:
力扣算法篇:螺旋矩阵_第1张图片
题解:使用边界值判断是否遍历结束,每遍历完一行或者一列及时更改边界值

class Solution {
     
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
     
        //m行n列的矩阵 按照顺时针螺旋顺序,返回矩阵中的所有元素
        //将行数和列数用变量保存
        int m = matrix.size();
        int n = matrix[0].size();
        // cout<
        //先考虑矩阵元素为空的情况
        if(m == 0 || n == 0){
     
            return {
     };
        }
        //再考虑不为空的情况
        //创建一个一维数组用以保存矩阵中的元素
        vector<int> result;
        //边界的定义
        int up = 0;
        int down = m-1;
        int left = 0;
        int right = n-1;
        //while循环顺时针螺旋遍历矩阵 不断调整边界
        while(true){
     
            //先从左往右走
            for(int j = left;j <= right;j++){
     
                result.push_back(matrix[up][j]);
            }
            //更改边界up的值
            up++;
            //判断能否从上往下走
            if(up > down){
     
                //不能 跳出循环
                break;
            }
            //能从上往下走
            for(int i = up;i <= down;i++){
     
                result.push_back(matrix[i][right]);
            }
            //更改边界right的值
            right--;
            //判断能否从右往左走
            if(left>right){
     
                //不能 跳出循环
                break;
            }
            //能从右往左走
            for(int j = right;j>=left;j--){
     
                    result.push_back(matrix[down][j]);   
            }
            //更改边界down的值
            down--;
            //能否从下往上走
            if(up>down){
     
                //不能
                break;
            }
            //能从下往上走
            for(int i = down;i >=up;i--){
     
                result.push_back(matrix[i][left]);
            }
            //更改边界left的值
            left++;
            //判断能否继续从左往右走
            if(left>right){
     
                //不能
                break;
            }
        }
        return result;
    }
};

你可能感兴趣的:(力扣算法篇,算法,leetcode)