LeetCode 螺旋矩阵

给定一个包含 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]

思路分析:按照题目要求,一圈一圈的往里遍历。
示意图
LeetCode 螺旋矩阵_第1张图片

class Solution {
public:
	vector<int> spiralOrder(vector<vector<int>>& matrix)
	{
		vector<int> result;
		int rowSize = matrix.size();//行数
		if (rowSize == 0){
			return result;
		}
		int colSize = matrix[0].size();//列数
		int row = 0, col = -1;//初始扫描坐标
		for (int i = 0; i <= rowSize / 2; ++i){//圈层
            while (col + 1 < colSize && matrix[row][col + 1] != INT_MIN){//圈的上方行(从左到右)
				++col;
				result.push_back(matrix[row][col]);
				matrix[row][col] = INT_MIN;
			}
			while (row + 1 < rowSize && matrix[row + 1][col] != INT_MIN){//圈的右边列(从上到下)
				++row;
				result.push_back(matrix[row][col]);
				matrix[row][col] = INT_MIN;
			}
			while (col - 1 >= 0 && matrix[row][col - 1] != INT_MIN){//圈的下边行(从右到左)
				--col;
				result.push_back(matrix[row][col]);
				matrix[row][col] = INT_MIN;
			}
			while (row - 1 >= 0 && matrix[row - 1][col] != INT_MIN){//圈的左边列(从下到上)
				--row;
				result.push_back(matrix[row][col]);
				matrix[row][col] = INT_MIN;
			}
        }
		return result;
	}
};

LeetCode 螺旋矩阵_第2张图片
我去翻出了执行为0ms的示范,执行却是12ms。。。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> spiralArray;
        // 原矩阵的高度
        int row = matrix.size();
        if (row == 0)
            return spiralArray;
        // 原矩阵的长度
        int column = matrix[0].size();
        if (column == 0)
            return spiralArray;
        // m,n记录当前所能到达的最大长和宽
        int m = column;
        int n = row;
        // a,b记录当前位置的坐标
        int a = 0, b = -1;
        // 记录步数
        int i = 0;
        // flag记录方向,1代表向右,2代表向下,3代表向左,4代表向上
        int flag = 1;
        // num代表已统计数字
        int num = 0;
        while (num != column * row)
        {
            i = 0;
            // 向右移动
            if (flag == 1)
            {
                while (i < m)
                {
                    b++;
                    //cout << a << '-' << b << endl;
                    spiralArray.push_back(matrix[a][b]);
                    num++;
                    i++;
                }
                n--;
                //cout << m << '+' << n << endl;
                flag = 2;
            }
            // 向下移动
            else if (flag == 2)
            {
                while (i < n)
                {
                    a++;
                    //cout << a << '-' << b << endl;
                    spiralArray.push_back(matrix[a][b]);
                    num++;
                    i++;
                }
                m--;
                //cout << m << '+' << n << endl;
                flag = 3;
            }
            // 向左移动
            else if (flag == 3)
            {
                while (i < m)
                {
                    b--;
                    //cout << a << '-' << b << endl;
                    spiralArray.push_back(matrix[a][b]);
                    num++;
                    i++;
                }
                n--;
                //cout << m << '+' << n << endl;
                flag = 4;
            }
            // 向上移动
            else if (flag == 4)
            {
                while (i < n)
                {
                    a--;
                    //cout << a << '-' << b << endl;
                    spiralArray.push_back(matrix[a][b]);
                    num++;
                    i++;
                }
                m--;
                //cout << m << '+' << n << endl;
                flag = 1;
            }
            else
            {
                break;
            }
        }
        return spiralArray;
    }
};

LeetCode 螺旋矩阵_第3张图片
LeetCode 螺旋矩阵_第4张图片
有点蒙圈。。。自我赶脚,自己的代码虽说思路一般,但是写的还是挺精简的。如果有更好的思路,欢迎交流。

你可能感兴趣的:(LeetCode)