矩阵遍历-Java

对于矩阵,直观上可以想象的遍历方式按行、列,有些题目还有螺旋遍历,实际题目很多是需要BFS或者DFS的。技巧是结果空间遍历其实是4个方向的选择。
这里简单记录一个比较典型的题目–矩阵中最长递增序列[leetcode-329]。原问题还有一点是考察任意点开始的最长路径,这里简化了下,毕竟只想研究BFS和DFS。

其实在图的遍历过程中,辅助isVisited数组是很常用的,这里BFS没有使用isVisited数组是因为最大增序保证了不会往回走。而DFS的辅助数组是不是就是isVisited数组呢,起码起到了部分作用,作为递归的结束条件。

import java.util.*;

public class matrixTraveral {
    static int[][] dirs = new int[][]{{-1,0},{0, -1},{1,0},{0,1}};
    static int[][] longestPath = new int[3][3];

    public static void main(String[] args) {
        int[][] matrix = new int[][]{
                {9,9,4},
                {6,6,8},
                {2,1,1}
        };
        System.out.println(DFS(matrix, 2,1));

    }
    static int BFS(int[][] matrix, int x, int y){
        int n = matrix.length;
        int m = matrix[0].length;
        Queue<int[]> queue = new LinkedList<>();
        queue.offer(new int[]{x,y});

        int ans = 0;
        while(!queue.isEmpty()){
            ans++;
            int size = queue.size();
            for(int s=0;s<size;s++){
                int[] poll = queue.poll();
                int i = poll[0];
                int j = poll[1];
                for(int[] dir:dirs){
                    int nextI = i+dir[0];
                    int nextJ = j+dir[1];
                    if(nextI>=0&&nextJ>=0&&nextJ<m&&nextI<n&&matrix[nextI][nextJ]>matrix[i][j]){
                        queue.offer(new int[]{nextI, nextJ});
                    }
                }
            }

        }
        return ans;
    }

    static int DFS(int[][] matrix, int x, int y){
        if(longestPath[x][y] != 0) return longestPath[x][y];
        int n = matrix.length;
        int m = matrix[0].length;
        longestPath[x][y] = 1;
        for(int[] dir:dirs){
            int nextI = x+dir[0];
            int nextJ = y+dir[1];
            if(nextI>=0&&nextJ>=0&&nextJ<m&&nextI<n&&matrix[nextI][nextJ]>matrix[x][y]){
                longestPath[x][y] = Math.max(longestPath[x][y], DFS(matrix, nextI, nextJ)+1);
            }
        }
        return longestPath[x][y];
    }

}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值