zoukankan      html  css  js  c++  java
  • LeetCode-54. Spiral Matrix

    一、问题描述

      给定一个矩阵、要求螺旋型输出矩阵结果。

      例子:给定矩阵[[1,2,3],[4,5,6],[7,8,9]]。输出结果为1,2,3,6,9,8,7,4,5。

    二、问题解决

      将矩阵分解成多个嵌套的空心矩形来遍历,将每个空心矩形的遍历分为四个部分:向右增长,向下增长,向左增长,向上增长。(代码中令direct等于1,2,3,4来表示这四个方向)

      用distance来表示某一个空心矩形遍历时,转向位置距离矩阵最外层边的距离,注意这个遍历在向左增长完之后加1,应为画一个空心矩形时,向上增长的尽头为向右增长的起始点,而不是矩阵边框。

      其他变量都很好理解了。

    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> result;
        if (matrix.size() == 0) return result;
        int direct = 1;
        int distance = 0;
        int posx = 0;
        int posy = 0;
        bool directchange = false;
        int step = 0;
        result.push_back(matrix[posy][posx]);
        while (true) {
            if (direct == 1) {
                if (posx + distance < matrix[0].size() - 1) 
                    posx++;
                else {
                    directchange = true;
                    direct++;
                }
            }
            else if (direct == 2) {
                if (posy + distance < matrix.size() - 1) 
                    posy++;
                else {
                    directchange = true;
                    direct++;
                }
            }
            else if (direct == 3) {
                if (posx > distance)
                    posx--;
                else {
                    directchange = true;
                    direct++;
                    distance++;
                }
            }
            else if (direct == 4) {
                if (posy > distance) 
                    posy--;
                else {
                    directchange = true;
                    direct = 1;
                }
            }
            if (directchange == false) {
                result.push_back(matrix[posy][posx]);
                step++;
            }
            else
                directchange = false;
            if (step == matrix.size() * matrix[0].size()-1)
                break;
        }
        return result;
    }
    
    //这是测试用例
    int main()
    {
        vector<vector<int>> v = { {1,2,3},{4,5,6},{7,8,9} };
        for (auto i : spiralOrder(v))
            cout << i << endl;
    
        system("pause");
        return 0;
    }

     

  • 相关阅读:
    部门创建注意问题
    我的技术博客开通啦~
    听侯钟雷老师的讲座,确认了几个问题。
    Dynamics CRM 批量添加用户时,报错:Server was unable to process request.
    汉字的Unicode范围(转)
    转载:Apache1.1 post请求无body的bug
    转载:Android有效解决加载大图片时内存溢出的问题
    2.2之前的webkit crash问题
    转载:Expect:100Continue & HTTP 417 Expectation
    城市旅游问题
  • 原文地址:https://www.cnblogs.com/likaiming/p/8504701.html
Copyright © 2011-2022 走看看