【LeetCode】1091. 二进制矩阵中的最短路径

一、题目

在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1)。

一条从左上角到右下角、长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, ..., C_k 组成:

  • 相邻单元格 C_iC_{i+1} 在八个方向之一上连通(此时,C_iC_{i+1} 不同且共享边或角)
  • C_1 位于(0, 0)(即,值为 grid[0][0])
  • C_k 位于 (N-1, N-1)(即,值为 grid[N-1][N-1])
  • 如果 C_i 位于 (r, c),则 grid[r][c] 为空(即,grid[r][c] == 0

示例 1:

输入:[[0,1],[1,0]]

1-input1

输出:2

Output1

示例 2:

输入:[[0,0,0],[1,1,0],[1,1,0]]

input2

输出:4

Output2

提示:

1.1 <= grid.length == grid[0].length <= 100
2.grid[i][j] 为 0 或 1

二、解决

1、暴力

思路: 略。
代码: 略。
时间复杂度: O ( ? ) O(?) O(?)
空间复杂度: O ( ? ) O(?) O(?)

2、DP

思路:


1、状态定义
dp[x][y]:从(00)到(x,y)位置的

2、状态方程
dp[i][j] = min{
   dp[new_i][new_j]+1, dp[i][j]},  dp[new_i][new_j]有效 -- 注意上下限 & 八连通

代码: 未通过,暂略。
时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)

3、BFS

思路:

先附一下BFS模板:

public class TreeNode {
   
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
   
        val = x;
    }
}

public List<List<Integer>> BFS(TreeNode root) {
   

	List<List<Integer>> allResults = new ArrayList<>();
    if (root == null)  return allResults;
    
    Queue<TreeNode> nodes = new LinkedList<>();
    nodes.add(root);
    while (!nodes.isEmpty()) {
   
        int levelSize = nodes.size();
        List<Integer> results = new ArrayList<>();
        for (int i = 0; i < levelSize; i++) {
   
            TreeNode currNode = nodes.poll();
            results.add(currNode.val);
            if (currNode.left != null)  nodes.add(currNode.left);
            if (currNode.right != null)  nodes.add(currNode.right);
        }
        allResults.add(results);
    }
    return allResults;
}

这里原理类似,从左上方向右下方逐层扩展,直到遇到最右下角的位置,返回对应长度。这里需要改动上述模板的地方有:数据结构变了,随之将TreeNode改成directions方向向量。所有的代码块具体内容随之做出合适的改变。

代码:

public class shortestPathBinaryMatrix {
   
    private static int[][] directions = {
   {
   0,1}, {
   0, -1}, {
   1, -1}, {
   1, 0}, {
   1, 1}, {
   -1, -1}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值