返回

挑战算法与问题导向:LeetCode 66 加一与 815 公交路线题解

前端

LeetCode 66. 加一

LeetCode 66. 加一是入门算法题的代表,以简单的方式考察了数组的操作与计算。

题目

给你一个由 n 个整数组成的数组 digits,其中每个整数在 09 之间,且数组中不存在任何前导零。请你对数组进行加一操作,并返回一个表示结果的数组。

示例

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示 123,加一后为 124。

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示 4321,加一后为 4322。

输入:digits = [9]
输出:[1,0]
解释:输入数组表示 9,加一后为 10。

解题思路与实现

本题的解题思路相对简单,我们可以借助 Python 内置的 strint 函数进行转换。具体步骤如下:

  1. digits 数组转换为字符串 s
  2. 使用 int(s, 10) 将字符串 s 转换为十进制整数。
  3. 将转换后的整数 num 加一,并将其转换为字符串 new_s
  4. 将字符串 new_s 转换为数组 new_digits,并返回。
def plus_one(digits):
    """
    给定一个由n个整数组成的数组digits,其中每个整数在0到9之间,且数组中不存在任何前导零。
    请你对数组进行加一操作,并返回一个表示结果的数组。
    """
    s = "".join(map(str, digits))
    num = int(s, 10)
    num += 1
    new_s = str(num)
    new_digits = list(map(int, new_s))
    return new_digits

算法分析

  • 时间复杂度:O(n),其中 n 为数组 digits 的长度。
  • 空间复杂度:O(n),其中 n 为数组 digits 的长度。

LeetCode 815. 公交路线

LeetCode 815. 公交路线是一道典型的图论问题,需要我们构建一个图并寻找最短路径。

题目

给你一个数组 routes,其中 routes[i] 表示城市中第 i 条公交路线经过的站点。请你计算并返回一个数组 distance,其中 distance[i] 表示访问所有站点 numBuses 条公交路线的最小总距离。

示例

输入:routes = [[1,2,7],[3,6,7],[4,5,7],[5,2,1],[3,7],[3,2,3],[2,4]]
numBuses = 1
输出:[4,-1]
解释:
1. 公交路线 1 经过 [1,2,7],距离为 1。
2. 公交路线 2 经过 [3,6,7],距离为 5。
3. 公交路线 3 经过 [4,5,7],距离为 4。
4. 公交路线 4 经过 [5,2,1],距离为 2。
5. 公交路线 5 经过 [3,7],距离为 2。
6. 公交路线 6 经过 [3,2,3],距离为 2。
7. 公交路线 7 经过 [2,4],距离为 1。
因为 numBuses = 1,所以我们只能使用一条公交路线。
所以,最短距离为 1 + 5 = 6。

输入:routes = [[1,2,7],[3,6,7],[4,5,7],[5,2,1],[3,7],[3,2,3],[2,4]]
numBuses = 2
输出:[3,4]
解释:
1. 公交路线 1 经过 [1,2,7],距离为 1。
2. 公交路线 2 经过 [3,6,7],距离为 5。
3. 公交路线 3 经过 [4,5,7],距离为 4。
4. 公交路线 4 经过 [5,2,1],距离为 2。
5. 公交路线 5 经过 [3,7],距离为 2。
6. 公交路线 6 经过 [3,2,3],距离为 2。
7. 公交路线 7 经过 [2,4],距离为 1。
因为 numBuses = 2,所以我们可以使用两条公交路线。
所以,最短距离为 1 + 2 = 3。

解题思路与实现

本题的解题思路是将题目中的公交路线图构建成一个无向图,其中站点为结点,公交路线为边。然后,我们可以使用广度优先搜索 (BFS) 来寻找从起点到终点的最短路径。

具体步骤如下:

  1. 将公交路线图构建成一个无向图。
  2. 使用广度优先搜索 (BFS) 来寻找从起点到终点的最短路径。
  3. 如果找到最短路径,则返回最短路径的长度。
  4. 否则,返回 -1。
from collections import defaultdict
from queue import Queue

def distance_between_bus_stops(routes, num_buses, src, dst):
    """
    给你一个数组 routes,其中 routes[i] 表示城市中第 i 条公交路线经过的站点。
    请你计算并返回一个数组 distance,其中 distance[i] 表示访问所有站点 numBuses 条公交路线的最小总距离。
    """
    # 构建一个图
    graph = defaultdict(list)
    for route in routes:
        for i in range(len(route)):
            for j in range(i + 1, len(route)):
                graph[route[i]].append(route[j])
                graph[route[j]].append(route[i])

    # 使用广度优先搜索 (BFS) 来寻找从起点到终点的最短路径
    queue = Queue()
    queue.put((src, 0))
    visited = set()
    visited.add(src)

    # 记录最短路径的长度
    min_distance = float('inf')

    while not queue.empty():
        # 从队列中取出当前结点和当前结点的距离
        node, distance = queue.get()

        # 如果当前结点为终点,则更新最短路径的长度
        if node == dst:
            min_distance = min(min_distance, distance)

        # 遍历当前结点的邻接结点
        for neighbor in graph[node]:
            # 如果邻接结点没有被访问过,则将其加入队列
            if neighbor not in visited:
                queue.put((neighbor, distance + 1))
                visited.add(neighbor)

    # 如果找到最短路径,则返回最短路径的长度
    if min_distance != float('inf'):
        return min_distance
    # 否则,返回 -1
    else:
        return -1

算法分析

  • 时间复杂度:O(n^2),其中 n 为公交路线图中的站点数。
  • 空间复杂度:O(n),其中 n 为公交路线图中的站点数。