• 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;
        }
    };
  • 相关阅读:
    VMware 创建的虚拟机,Xshell无法进行连接
    Centos7 文件修改详情
    Centos7 selinux关闭
    centos7 RPM命令使用
    centos 操作系统优化
    centos 内存使用情况+负载使用情况
    Centos 修改环境变量
    centos7 系统级别(持续更新)
    centos7 常规修改信息(比较杂的)持续更新
    centos7 修改网卡信息
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9165321.html
Copyright © 2020-2023  润新知