返回
挑战算法与问题导向:LeetCode 66 加一与 815 公交路线题解
前端
2024-01-11 22:50:43
LeetCode 66. 加一
LeetCode 66. 加一是入门算法题的代表,以简单的方式考察了数组的操作与计算。
题目
给你一个由 n
个整数组成的数组 digits
,其中每个整数在 0
到 9
之间,且数组中不存在任何前导零。请你对数组进行加一操作,并返回一个表示结果的数组。
示例
输入: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 内置的 str
与 int
函数进行转换。具体步骤如下:
- 将
digits
数组转换为字符串s
。 - 使用
int(s, 10)
将字符串s
转换为十进制整数。 - 将转换后的整数
num
加一,并将其转换为字符串new_s
。 - 将字符串
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) 来寻找从起点到终点的最短路径。
具体步骤如下:
- 将公交路线图构建成一个无向图。
- 使用广度优先搜索 (BFS) 来寻找从起点到终点的最短路径。
- 如果找到最短路径,则返回最短路径的长度。
- 否则,返回 -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 为公交路线图中的站点数。