【每日一题Day218】LC1091 二进制矩阵中的最短路径 | BFS

该问题是一个寻找最短路径的问题,使用广度优先搜索(BFS)策略解决。通过一个二维数组grid表示二进制矩阵,利用队列进行BFS搜索,从起点(1,1)开始,每次移动到相邻的未访问节点,直到到达终点(n,n)。过程中避免重复访问已访问节点,时间复杂度和空间复杂度都为O(n^2)。
摘要由CSDN通过智能技术生成

二进制矩阵中的最短路径【LC1091】

你驾驶出租车行驶在一条有 n 个地点的路上。这 n 个地点从近到远编号为 1n ,你想要从 1 开到 n ,通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向。

乘客信息用一个下标从 0 开始的二维数组 rides 表示,其中 rides[i] = [starti, endi, tipi] 表示第 i 位乘客需要从地点 starti 前往 endi ,愿意支付 tipi 元的小费。

每一位 你选择接单的乘客 i ,你可以 盈利 endi - starti + tipi 元。你同时 最多 只能接一个订单。

给你 nrides ,请你返回在最优接单方案下,你能盈利 最多 多少元。

**注意:**你可以在一个地点放下一位乘客,并在同一个地点接上另一位乘客。

  • 思路

    常规BFS,使用队列进行BFS,搜索时记录搜索的轮数。搜索到一个可以访问的节点时,将其入队。如果搜索到终点时,直接返回当前轮数;如果队列为空仍为访问到终点,那么返回-1;

    • 访问过一个节点后,为了避免重复访问直接将给节点设置为-1
  • 实现

    class Solution {
        public int shortestPathBinaryMatrix(int[][] grid) {
            // BFS
           int[][] dirs = {{0, 1}, {1, 0}, {1, 1}, {0, -1}, {-1, 0}, {-1, -1}, {1, -1}, {-1, 1}};// 8个方向?
           Deque<int[]> queue = new LinkedList<>();
           int n = grid.length;
           int count = 0;
           if (grid[0][0] == 0){
               queue.add(new int[]{0, 0});
           }
           while(!queue.isEmpty()){
               int size = queue.size();
               count++;
               for (int i = 0; i < size; i++){
                    int[] p = queue.poll();
                    int x = p[0], y = p[1];
                    if (x == n - 1 && y == n - 1) return count;
                    for (int[] dir : dirs){
                        int x1 = x + dir[0], y1 = y + dir[1];           
                        if (x1 >= 0 && y1 >= 0 && x1 <n && y1 < n && grid[x1][y1] != 1){                 
                            queue.add(new int[]{x1, y1});
                            grid[x1][y1] = 1;
                        }
                    }
               }
               
           }
           return -1;
    
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n 2 ) \mathcal{O}(n^2) O(n2)
      • 空间复杂度: O ( n 2 ) \mathcal{O}(n^2) O(n2)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BFS宽度优先搜索)算法常被用于解决迷宫问题最短路径问题。该算法基于队列的实现方式,可以快速搜索出从起点到达终点的最短路径。 具体来说,BFS算法的步骤如下: 1. 创建一个队列,并将起点加入队列。 2. 创建一个二维数组来记录迷宫每个位置的状态,例如是否已被访问过或者是墙壁等。 3. 使用循环来遍历队列的元素,直到队列为空。 4. 在循环,首先从队列取出一个节点,并标记该节点为已访问。 5. 然后检查该节点的上、下、左、右四个方向的相邻节点,如果相邻节点是可行的且未被访问过,则将其加入队列,并记录其距离起点的步数。 6. 重复步骤4和步骤5,直到找到终点或者遍历完所有可行的节点。 7. 如果找到终点,则可以通过回溯找到最短路径。 需要注意的是,在BFS算法,我们需要用一个二维数组来记录每个节点的状态,这样可以避免重复访问节点和处理墙壁等不可行的节点。 总结起来,BFS算法通过队列的方式,逐层遍历迷宫的节点,直到找到终点。在遍历过程,通过记录每个节点距离起点的步数,可以求解出最短路径。 参考文献: BFS 算法是一种基于队列实现的搜索算法,常用于解决图论问题和迷宫问题。 BFS(Breadth First Search,广度优先搜索)是一种基于队列实现的搜索算法,常用于解决图论问题和迷宫问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值