📅  最后修改于: 2023-12-03 14:53:46.217000             🧑  作者: Mango
给定三种操作:+1,-1,*2。现在有两个正整数n和m,问将n转换为m所需的给定运算的最小数目。
这是一道典型的搜索问题,我们可以用广度优先搜索(BFS)实现。首先将初始状态n加入队列,然后循环执行以下步骤:
我们可以用一个数组depth来记录每个状态的最小转换步数,以确保BFS搜索到的第一个目标状态是最优解。
注意,如果n大于m,显然只能使用-1操作,所以我们需要在搜索之前进行判断。另外,如果n等于m,直接返回0即可。在实现中,我们可以使用一个set(或unordered_set)来记录已搜索过的状态,以避免重复搜索。
def min_operations(n: int, m: int) -> int:
if n > m:
return n - m
if n == m:
return 0
queue = [n]
visited = set([n])
depth = {n: 0}
while queue:
x = queue.pop(0)
for y in [x+1, x-1, x*2]:
if y not in visited and 1 <= y <= 100000:
queue.append(y)
visited.add(y)
depth[y] = depth[x] + 1
if y == m:
return depth[y]
return -1
代码解释:
queue
:维护一个搜索队列visited
:记录已搜索过的状态depth
:记录每个状态的最小转换步数x
:队首元素y
:x的下一步可能状态时间复杂度:O(max(n, m)),空间复杂度:O(max(n, m))。