← 返回博客列表
DoorDash

DoorDash VO 面试题:计算最近 DashMart 的距离(二维网格多源 BFS / 最短路径)

2025-11-27

# DoorDash VO 面试题:计算最近 DashMart 的距离(二维网格多源 BFS / 最短路径)

oavoservice 原创复盘:这类“从多个源出发求最短距离”的题,面试一眼就要想到 Multi-source BFS

题目(改写版)

给定一个二维网格,字符含义:

给定若干个查询坐标 locations,对每个位置返回到最近 DashMart 的最短步数(上下左右移动)。

关键思路:多源 BFS

如果对每个查询单独 BFS,会很慢。

更好的方法:

复杂度

Python 参考实现

from collections import deque


def build_distance_to_dashmart(grid):
    if not grid or not grid[0]:
        return []

    R, C = len(grid), len(grid[0])
    INF = 10**15
    dist = [[INF] * C for _ in range(R)]
    q = deque()

    # 多源:所有 D 入队
    for r in range(R):
        for c in range(C):
            if grid[r][c] == 'D':
                dist[r][c] = 0
                q.append((r, c))

    # BFS
    dirs = [(1,0), (-1,0), (0,1), (0,-1)]
    while q:
        r, c = q.popleft()
        for dr, dc in dirs:
            nr, nc = r + dr, c + dc
            if 0 <= nr < R and 0 <= nc < C and grid[nr][nc] != 'X':
                if dist[nr][nc] > dist[r][c] + 1:
                    dist[nr][nc] = dist[r][c] + 1
                    q.append((nr, nc))

    return dist


def query_locations(grid, locations):
    dist = build_distance_to_dashmart(grid)
    if not dist:
        return [-1] * len(locations)

    R, C = len(grid), len(grid[0])
    ans = []
    for r, c in locations:
        if not (0 <= r < R and 0 <= c < C):
            ans.append(-1)
            continue
        if grid[r][c] == 'X':
            ans.append(-1)
            continue
        d = dist[r][c]
        ans.append(-1 if d >= 10**15 else d)
    return ans

常见坑


DoorDash 的 VO 经常把 BFS 换成业务语言(DashMart/Restaurant),但本质还是最短路。oavoservice 会训练你把业务描述迅速映射到“多源 BFS”。


需要面试真题? 立刻联系微信 Coding0201,获得真题