📜  minimum-number-of-steps-to-reduce-number-to-1 - Python (1)

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

Minimum Number of Steps to Reduce Number to 1 - Python

问题描述

给定一个正整数 n,你可以执行以下操作之一:

  1. 如果 n 是偶数,则将 n/2 替换为 n
  2. 如果 n 是奇数,则将 3n+1 替换为 n

使用上述操作重新排列 n ,使其变为 1。 返回达到 1 所需的最小操作次数。

解法

题目要求我们将一个正整数 n 通过上述操作变为 1,且操作次数最少,因此可以考虑使用动态规划来解决该问题。

设 $dp_{i}$ 为将正整数 $i$ 转化为 $1$ 所需的最小操作次数。则有:

当 $i$ 为偶数时,有 $dp_{i} = dp_{i/2}+1$。 当 $i$ 为奇数时,有 $dp_{i} = dp_{3i+1}+1$。

初始状态:$dp_{1}=0$

根据上述式子,我们可以使用递归或迭代的方式来求解最终的答案。

代码实现
def minSteps(n: int) -> int:
    dp = [0] * (n+1)
    for i in range(2, n+1):
        dp[i] = dp[i//2] + 1 if i % 2 == 0 else dp[3*i+1] + 1
    return dp[n]
复杂度分析

时间复杂度:$O(N)$,其中 $N$ 为给定的正整数。

空间复杂度:$O(N)$,需要开辟长度为 $N+1$ 的数组存储状态信息。