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

54. 螺旋矩阵

使用vis数组记录该位置是否已经被访问

定义一个int型dir来记录方向,0123分别代表右下左上

当越界或碰壁已访问的位置后,修改dir并计算下一个位置

否则根据原dir计算下一个位置

java 复制代码
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修改,获得正确的新坐标

java 复制代码
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;
    }
}
相关推荐
搞笑症患者4 分钟前
压缩感知(Compressed Sensing, CS)
算法·最小二乘法·压缩感知·正交匹配追踪omp·迭代阈值it算法
ComputerInBook8 分钟前
代数学基本概念理解——幺正矩阵(Unitary matrix)(酉矩阵?)
线性代数·矩阵·正交矩阵·幺正矩阵·酉矩阵
im_AMBER8 分钟前
Leetcode 101 对链表进行插入排序
数据结构·笔记·学习·算法·leetcode·排序算法
予枫的编程笔记9 分钟前
【Java集合】深入浅出 Java HashMap:从链表到红黑树的“进化”之路
java·开发语言·数据结构·人工智能·链表·哈希算法
ohoy14 分钟前
RedisTemplate 使用之Set
java·开发语言·redis
mjhcsp15 分钟前
C++ 后缀数组(SA):原理、实现与应用全解析
java·开发语言·c++·后缀数组sa
快手技术26 分钟前
AAAI 2026|全面发力!快手斩获 3 篇 Oral,12 篇论文入选!
前端·后端·算法
颜酱27 分钟前
前端算法必备:滑动窗口从入门到很熟练(最长/最短/计数三大类型)
前端·后端·算法
8***f39529 分钟前
Spring容器初始化扩展点:ApplicationContextInitializer
java·后端·spring
做科研的周师兄29 分钟前
【MATLAB 实战】栅格数据 K-Means 聚类(分块处理版)—— 解决大数据内存溢出、运行卡顿问题
人工智能·算法·机器学习·matlab·kmeans·聚类