📌  相关文章
📜  将 N 减少到 1 所需的最少操作数(1)

📅  最后修改于: 2023-12-03 15:39:12.951000             🧑  作者: Mango

将 N 减少到 1 所需的最少操作数

当给定一个整数 N,我们可以进行如下操作:

  • 如果 N 是偶数,则将 N 替换为 N/2。
  • 如果 N 是奇数,则可以进行加一或减一操作,即将 N 替换为 N+1 或 N-1。

目标是将 N 减少到 1,问最少需要多少次操作。

思路

我们可以使用动态规划来解决这个问题。

设 $dp[i]$ 表示将 i 减少到 1 所需的最少操作数。

对于偶数 i,我们可以将其除以 2,即 $dp[i] = dp[i/2] + 1$。

对于奇数 i,我们需要加一或者减一,取决于 $dp[i-1]$ 和 $dp[i+1]$ 的大小,具体地:

  • 如果 $dp[i-1] \lt dp[i+1]$,那么我们将 i 替换为 i-1,即 $dp[i] = dp[i-1]+1$。
  • 如果 $dp[i-1] \gt dp[i+1]$,那么我们将 i 替换为 i+1,即 $dp[i] = dp[i+1]+1$。
  • 如果 $dp[i-1] = dp[i+1]$,则我们可以任意选择 i-1 或者 i+1,具体使用哪个转移方程都可以,即 $dp[i] = \min(dp[i-1], dp[i+1])+1$。
代码实现
def reduce_to_1(n: int) -> int:
    dp = [0] * (n+1)
    for i in range(2, n+1):
        if i % 2 == 0:
            dp[i] = dp[i//2] + 1
        else:
            dp[i] = min(dp[i-1], dp[i+1]) + 1
    return dp[n]
时间复杂度

时间复杂度为 O(N)。