Leetcode 54. 螺旋矩阵(二维数组移动坐标)

54. 螺旋矩阵

使用vis数组记录该位置是否已经被访问
定义一个int型dir来记录方向,0123分别代表右下左上
当越界或碰壁已访问的位置后,修改dir并计算下一个位置
否则根据原dir计算下一个位置

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();
        int n = matrix.length;
        int m = matrix[0].length;
        int dir = 0; // 0右  1下  2左  3上
        boolean vis[][] = new boolean[n][m];
        int x = 0;
        int y = 0;
        for(int i = 0; i < n*m; i ++){
            list.add(matrix[x][y]);
            vis[x][y] = true;
            if(dir == 0){
                if(y + 1 >= m || vis[x][y+1] == true){
                    dir = (dir + 1) % 4;
                    x = x + 1;
                }
                else{
                    y = y + 1;
                }
            }
            else if(dir == 1){
                if(x + 1 >= n || vis[x+1][y] == true){
                    dir = (dir + 1) % 4;
                    y = y - 1;
                }
                else{
                    x = x + 1;
                }
            }
            else if(dir == 2){
                if(y - 1 < 0 || vis[x][y-1] == true){
                    dir = (dir + 1) % 4;
                    x = x - 1;
                }
                else{
                    y = y - 1;
                }
            }
            else{
                if(x - 1 < 0 || vis[x-1][y] == true){
                    dir = (dir + 1) % 4;
                    y = y + 1;
                }
                else{
                    x = x - 1;
                }
            }
        }
        return list;
    }
}

简化

常用思路,使用二维数组dirs[4][2]进行坐标的上下左右四个方位移动,简化代码
(也常用dirs[8][2]获取坐标的周围8个位置)
使用dirs和dir计算下一个将要使用的新坐标,若越界或碰壁,则将dir修改,获得正确的新坐标

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();
        int n = matrix.length;
        int m = matrix[0].length;
        int dir = 0; // 0右  1下  2左  3上
        int dirs[][] = {{0,1},{1,0},{0,-1},{-1,0}}; // 对应dir四种移动坐标变化
        boolean vis[][] = new boolean[n][m];
        int x = 0;
        int y = 0;
        for(int i = 0; i < n*m; i ++){
            list.add(matrix[x][y]);
            vis[x][y] = true;
            // 判断
            int newX = x + dirs[dir][0];
            int newY = y + dirs[dir][1];
            if(newX < 0 || newX >= n || newY < 0 || newY >= m || vis[newX][newY] == true){
                dir = (dir + 1) % 4;
            }
            // 移动
            x += dirs[dir][0];
            y += dirs[dir][1];
        }
        return list;
    }
}

相关推荐

  1. Leetcode 54. 螺旋矩阵数组移动坐标

    2024-06-08 22:08:01       33 阅读
  2. LeetCode 54. 螺旋矩阵

    2024-06-08 22:08:01       39 阅读
  3. 1130. 【数组】打印螺旋矩阵

    2024-06-08 22:08:01       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 22:08:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 22:08:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 22:08:01       82 阅读
  4. Python语言-面向对象

    2024-06-08 22:08:01       91 阅读

热门阅读

  1. iperf

    2024-06-08 22:08:01       23 阅读
  2. 爬虫-打包整个小说网站

    2024-06-08 22:08:01       27 阅读
  3. 用Python实现奇怪的疯狂按键需求

    2024-06-08 22:08:01       36 阅读
  4. Django Did you install mysqlclient?

    2024-06-08 22:08:01       35 阅读
  5. 力扣2762. 不间断子数组

    2024-06-08 22:08:01       34 阅读
  6. 使用sqlldr向oracle导入大量数据

    2024-06-08 22:08:01       31 阅读
  7. 三大网络简介

    2024-06-08 22:08:01       28 阅读
  8. DevOps的原理及应用详解(一)

    2024-06-08 22:08:01       29 阅读
  9. C# 接口的使用案例

    2024-06-08 22:08:01       64 阅读
  10. OpenCV的核心数据结构

    2024-06-08 22:08:01       24 阅读
  11. Rockmongo详解:高效管理MongoDB的图形化利器

    2024-06-08 22:08:01       31 阅读