LeetCode 螺旋矩阵II

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

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

思路分析:请先查阅 LeetCode 螺旋矩阵
这道题与打印螺旋矩阵一样,按圈层进行操作,把遍历修改为写入即可。
LeetCode 螺旋矩阵II_第1张图片

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> matrix(n, vector<int>(n, 0));
        if (n == 0){
            return matrix;
        }
        int row = 0, col = -1;//初始扫描坐标
        int cnt = 1;
		for (int i = 0; i <= n / 2; ++i){//圈层
            while (col + 1 < n && matrix[row][col + 1] == 0){//圈的上方行(从左到右)
				++col;
				matrix[row][col] = cnt;
                ++cnt;
			}
			while (row + 1 < n && matrix[row + 1][col] == 0){//圈的右边列(从上到下)
				++row;
				matrix[row][col] = cnt;
                ++cnt;
			}
			while (col - 1 >= 0 && matrix[row][col - 1] == 0){//圈的下边行(从右到左)
				--col;
				matrix[row][col] = cnt;
                ++cnt;
			}
			while (row - 1 >= 0 && matrix[row - 1][col] == 0){//圈的左边列(从下到上)
				--row;
				matrix[row][col] = cnt;
                ++cnt;
			}
        }
		return matrix;
    }
};

LeetCode 螺旋矩阵II_第2张图片

//执行用时为 4 ms 的范例
class Solution {
public:
    vector> generateMatrix(int n) {
        vector> array (n, vector(n, 0));
        //flag记录方向,1代表向右,2代表向下,3代表向左,4代表向上
        int flag = 1;
        //num记录已改变的数字数量
        int num = 0;
        //i记录步数
        int i = 0;
        // maxm, maxn记录当前能扩展的最大量
        int maxm = n, maxn = n;
        // a, b记录当前坐标
        int a = 0, b = -1;
        while (num != n * n)
        {
            i = 0;
            // 向右移动
            if (flag == 1)
            {
                while (i < maxm)
                {
                    b++;
                    //cout << a << '-' << b << endl;
                    num++;
                    array[a][b] = num;
                    i++;
                }
                maxn--;
                //cout << m << '+' << n << endl;
                flag = 2;
            }
            // 向下移动
            else if (flag == 2)
            {
                while (i < maxn)
                {
                    a++;
                    //cout << a << '-' << b << endl;
                    num++;
                    array[a][b] = num;
                    i++;
                }
                maxm--;
                //cout << m << '+' << n << endl;
                flag = 3;
            }
            // 向左移动
            else if (flag == 3)
            {
                while (i < maxm)
                {
                    b--;
                    //cout << a << '-' << b << endl;
                    num++;
                    array[a][b] = num;
                    i++;
                }
                maxn--;
                //cout << m << '+' << n << endl;
                flag = 4;
            }
            // 向上移动
            else if (flag == 4)
            {
                while (i < maxn)
                {
                    a--;
                    //cout << a << '-' << b << endl;
                    num++;
                    array[a][b] = num;
                    i++;
                }
                maxm--;
                //cout << m << '+' << n << endl;
                flag = 1;
            }
            else
            {
                break;
            }
        }
        return array;
    }
};

4ms的示范代码逻辑会比我的代码逻辑简单?LeetCode 螺旋矩阵II_第3张图片

你可能感兴趣的:(LeetCode)