ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode 54 螺旋数组

2021-05-28 21:03:13  阅读:131  来源: 互联网

标签:return matrix int 54 ++ 数组 visited leetcode dir


简介

忘不了, 这是华为面试官给我的面试题, 但是我没有在1分钟内做出来. 或许那个时候面试官本来就不想要一个人.
使用模拟的方法.
使用一个visited数组, 判断是否走到边界, 只有四个方向:

  1. j++
  2. i++
  3. j--
  4. i--
    依次循环.

code

class Solution {
public:
    vector<int> res;
    void visit(int &i, int &j, vector<vector<bool>> &visited, vector<vector<int>> &matrix, int dir){
        if(dir == 1){
            for(; j<matrix[0].size(); j++){
                if(visited[i][j] == false) {
                    res.push_back(matrix[i][j]);
                    visited[i][j] = true;
                }else{
                    j--;
                    dir++;
                    i++;
                    if(i >= matrix.size() || visited[i][j] == true){
                        return;
                    }
                    visit(i, j, visited, matrix, dir);
                    break;
                }
                if(j == matrix[0].size() - 1){
                    dir++;
                    i++;
                    if(i >= matrix.size() || visited[i][j] == true){
                        return;
                    }
                    visit(i, j, visited, matrix, dir);
                    break;
                }
            }
        }
        else if(dir == 2){
            for(; i<matrix.size(); i++){
                if(visited[i][j] == false){
                    res.push_back(matrix[i][j]);
                    visited[i][j] = true;
                }else{
                    i--;
                    dir++;
                    j--;
                    if(j < 0 || visited[i][j] == true){
                        return;
                    }
                    visit(i, j, visited, matrix, dir);
                    break;
                }
                if(i == matrix.size() - 1){
                    dir++;
                    j--;
                    if(j < 0 || visited[i][j] == true){
                        return;
                    }
                    visit(i, j, visited, matrix, dir);
                    break;
                }
            }
        }
        else if(dir == 3){
            for(;j>=0; j--){
                 if(visited[i][j] == false) {
                    res.push_back(matrix[i][j]);
                    visited[i][j] = true;
                }else{
                    j++;
                    i--;
                    dir++;
                    if(i < 0 || visited[i][j] == true){
                        return;
                    }
                    visit(i, j, visited, matrix, dir);
                    break;
                }
                if(j == 0){
                    dir++;
                    i--;
                    if(i < 0 || visited[i][j] == true){
                        return;
                    }
                    visit(i, j, visited, matrix, dir);
                    break;
                }
            }
        }
        else if(dir == 4){
            for(; i>=0; i--){
                if(visited[i][j] == false){
                    res.push_back(matrix[i][j]);
                    visited[i][j] = true;
                }else{
                    i++;
                    j++;
                    dir = 1;
                    if(visited[i][j] == true){
                        return;
                    }
                    visit(i, j, visited, matrix, dir);
                    break;
                }
                if(i == 0){
                    dir = 1;
                    j++;
                    if(visited[i][j] == true){
                        return;
                    }
                    visit(i, j, visited, matrix, dir);
                    break;
                }
            }
        }
    }
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<vector<bool>> visited(matrix.size(), vector<bool>(matrix[0].size(), false));
        int dir[4] = {1, 2, 3, 4}; // i++, j++, i--, j--
        int i, j;
        i = j = 0;
        visit(i, j, visited, matrix, 1);
        return res;
    }
};

官方的代码

简短精炼, 比我这种乱七八糟的好很多. 还用到了方向数组, 我记得方向数组, 但是忘记了他是二维的数组.

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> order = new ArrayList<Integer>();
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
            return order;
        }
        int rows = matrix.length, columns = matrix[0].length;
        boolean[][] visited = new boolean[rows][columns];
        int total = rows * columns;
        int row = 0;
        int column = 0;
        int [][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        int directionIndex = 0;
        for(int i = 0; i<total; i++){
            order.add(matrix[row][column]);
            visited[row][column] = true;
            int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
            if(nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[nextRow][nextColumn]){
                directionIndex = (directionIndex + 1) % 4;
            }
            row += directions[directionIndex][0];
            column += directions[directionIndex][1];
        }
        return order;
    }
}

标签:return,matrix,int,54,++,数组,visited,leetcode,dir
来源: https://www.cnblogs.com/eat-too-much/p/14823766.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有