• LeetCode: Spiral Matrix


    多数次过。很奇怪dfs函数声明的时候形参里dir[][]不能用,必须为dir[4][2].

     1 class Solution {
     2 public:
     3     bool out(int x, int y, int m, int n) {
     4         if (x >= m || x < 0 || y >= n || y < 0) return true;
     5         return false;
     6     }
     7     void dfs(int x, int y, int dir[4][2], int dep, int m, int n, vector<int> &ret, 
     8         int direct, vector<vector<bool>> &visit, vector<vector<int>> matrix) {
     9         if (dep == m*n) return;
    10         visit[x][y] = true;
    11         ret.push_back(matrix[x][y]);
    12         if (out(x+dir[direct][0], y+dir[direct][1], m, n) || visit[x+dir[direct][0]][y+dir[direct][1]])
    13             direct = (direct+1) % 4;
    14         dfs(x+dir[direct][0], y+dir[direct][1], dir, dep+1, m, n, ret, direct, visit, matrix);
    15     }
    16     vector<int> spiralOrder(vector<vector<int> > &matrix) {
    17         // Start typing your C/C++ solution below
    18         // DO NOT write int main() function
    19         vector<int> ret;
    20         if (!matrix.size()) return ret;
    21         int m = matrix.size();
    22         int n = matrix[0].size();
    23         int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    24         vector<vector<bool>> visit(m, vector<bool>(n, false));
    25         dfs(0, 0, dir, 0, m, n, ret, 0, visit, matrix);
    26         return ret;
    27     }
    28 };

     后来写了个不用递归的,这个复杂度会低

     1 class Solution {
     2 public:
     3     bool check(int x, int y, int dir[4][2], int curdir, int m, int n, vector<vector<bool> > &visit) {
     4         int xx = x + dir[curdir][0];
     5         int yy = y + dir[curdir][1];
     6         if (xx >= 0 && xx < m && yy >= 0 && yy < n && !visit[xx][yy]) return true;
     7         else return false;
     8     }
     9     vector<int> spiralOrder(vector<vector<int> > &matrix) {
    10         // Start typing your C/C++ solution below
    11         // DO NOT write int main() function
    12         vector<int> ret;
    13         if (!matrix.size() || !matrix[0].size()) return ret;
    14         int m = matrix.size();
    15         int n = matrix[0].size();
    16         vector<vector<bool> > visit(m, vector<bool>(n));
    17         int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    18         int dep, x, y, curdir;
    19         curdir = x = y = dep = 0;
    20         ret.push_back(matrix[0][0]);
    21         visit[0][0] = true;
    22         dep++;
    23         while (dep < m*n) {
    24             while (!check(x, y, dir, curdir, m, n, visit)) curdir = (curdir+1)%4;
    25             x += dir[curdir][0];
    26             y += dir[curdir][1];
    27             visit[x][y] = true;
    28             ret.push_back(matrix[x][y]);
    29             dep++;
    30         }
    31         return ret;
    32     }
    33 };

     C#

     1 public class Solution {
     2     public List<int> SpiralOrder(int[,] matrix) {
     3         List<int> ans = new List<int>();
     4         int m = matrix.GetLength(0);
     5         int n = matrix.GetLength(1);
     6         if (m == 0 || n == 0) return ans;
     7         bool[,] visit = new bool[m, n];
     8         int[,] dir = new int[4, 2] {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
     9         int dep = 0, x = 0, y = 0, curdir = 0;
    10         ans.Add(matrix[0, 0]);
    11         visit[0, 0] = true;
    12         dep++;
    13         while (dep < m * n) {
    14             while (!check(x, y, dir, curdir, m, n, visit)) curdir = (curdir + 1) % 4;
    15             x += dir[curdir, 0];
    16             y += dir[curdir, 1];
    17             visit[x, y] = true;
    18             ans.Add(matrix[x, y]);
    19             dep++;
    20         }
    21         return ans;
    22     }
    23     public bool check(int x, int y, int[,] dir, int curdir, int m, int n, bool[,] visit) {
    24         int xx = x + dir[curdir, 0];
    25         int yy = y + dir[curdir, 1];
    26         if (xx >= 0 && xx < m && yy >= 0 && yy < n && !visit[xx, yy]) return true;
    27         else return false;
    28     }
    29 }
    View Code
  • 相关阅读:
    Hive 导入、导出数据
    mysql 命令行参数说明
    mysql 查看表信息
    python之冒泡排序
    python之选择排序
    python之快速排序
    光荣之路测试开发面试linux考题之四:性能命令
    测试开发linux面试之三:后台进程之操作
    测试开发面试的Linux面试题总结之二:常用命令
    测试开发面试的Linux面试题总结之一:vim使用方法
  • 原文地址:https://www.cnblogs.com/yingzhongwen/p/3033459.html
Copyright © 2020-2023  润新知