📌  相关文章
📜  将n转换为m所需的给定运算的最小数目(1)

📅  最后修改于: 2023-12-03 14:53:46.217000             🧑  作者: Mango

题目描述

给定三种操作:+1,-1,*2。现在有两个正整数n和m,问将n转换为m所需的给定运算的最小数目。

算法分析

这是一道典型的搜索问题,我们可以用广度优先搜索(BFS)实现。首先将初始状态n加入队列,然后循环执行以下步骤:

  1. 取出队首元素x
  2. 如果x等于目标m,则返回当前搜索深度
  3. 否则将x的下一步可能状态加入队列

我们可以用一个数组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))。