zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    软件工程结对作业
    软件工程第二次作业
    软件工程第一次作业
    MATLAB安装教程
    实现生成小学四则运算练习题
    结对编程-审查代码
    软件第三次作业
    练习使用Eclipse进行单元测试
    软件工程第一次作业
    Visual Studio Code (vscode)
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9165321.html
Copyright © 2011-2022 走看看