📅  最后修改于: 2023-12-03 15:17:39.644000             🧑  作者: Mango
给定一个正整数 n
,你可以执行以下操作之一:
n
是偶数,则将 n/2
替换为 n
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$ 的数组存储状态信息。