59. Spiral Matrix II

问题描述:

Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

Example:

Input: 3
Output:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

解题思路:

这道题我认为主要是找到什么时候变化坐标以及如何变化。

要求螺旋状填充矩阵:即

可以看到几个关键的变换方向的转折点,那我们来寻找它变换方向的条件:

以ret[i][j]来表达矩阵中的一个元素

当 i > n-1 或 i < 0时需要变换方向,同理对j

当ret[i][j]有值时需要变换方向

可以发现:方向变化都是有规律的

即 右-> 下 -> 左 -> 上 -> 右

不妨以这个顺序来试探,并且改变方向

需要注意的是:

找不到合适方向后需要对当前值进行检测!因为当前值可能就是最后的值!否则会陷入死循环!

代码:

#define R 0
#define D 1
#define L 2
#define U 3

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> ret(n, vector<int>(n, 0));
        int count = 1;
        int i = 0, j = 0;
        int limit = n*n;
        int direction = R;
        while(count <= limit){
            ret[i][j] = count;
            if(direction == R){
                j++;
                if(j < n && ret[i][j] == 0){
                    count++;
                    continue;
                }
                direction = D;
                j--;
                
            }
            if(direction == D){
                i++;
                if(i < n && ret[i][j] == 0){
                    count++;
                    continue;
                }
                direction = L;
                i--;
            }
            if(direction == L){
                j--;
                if(j > -1 && ret[i][j] == 0){
                    count++;
                    continue;
                }
                direction = U;
                j++;
            }
            if(direction == U){
                i--;
                if(i > -1 && ret[i][j] == 0){
                    count++;
                    continue;
                }
                direction = R;
                i++;
            }
            if(count == limit)
                break;
        }
        
        return ret;
    }
};
原文地址:https://www.cnblogs.com/yaoyudadudu/p/9165321.html