给定一个整数N 。任务是在从1到N-1的范围内找到其 Collatz 序列中具有最大项数和序列中项数的数字。
数字 N的 collatz 序列定义为:
- 如果N是奇数,则将N更改为3*N + 1 。
- 如果N是Even然后将N更改为N / 2 。
例如,让我们看看N = 13时的序列:
13 -> 40 -> 20 -> 10 -> 5 > 16 -> 8 -> 4 -> 2 -> 1
例子:
Input: 10
Output: (9, 20)
9 has 20 terms in its Collatz sequence
Input: 50
Output: (27, 112)
27 has 112 terms
方法:
正如在上面讨论的N = 13示例中, N = 13和N = 40 的collatz 序列具有相似的术语,除了一个,这确保可能涉及动态编程来存储子问题的答案并重用它。
但是在这里正常的记忆将不起作用,因为在一个步骤中,我们要么使一个数字变大(在上面的例子中 N = 13 取决于 N = 40 的解决方案)要么除以2 (N = 40 解决方案取决于解决方案N = 20)。
因此,我们将使用 Map/dictionary 数据结构来存储子问题的解决方案,而不是使用 dp 数组,并将执行 collatz 序列中讨论的正常操作。
下面是上述方法的实现:
def collatzLenUtil(n, collLenMap):
# If value already
# computed, return it
if n in collLenMap:
return collLenMap[n]
# Base case
if(n == 1):
collLenMap[n] = 1
# Even case
elif(n % 2 == 0):
collLenMap[n] \
= 1 \
+ collatzLenUtil(n//2, collLenMap)
# Odd case
else:
collLenMap[n] \
= 1 \
+ collatzLenUtil(3 * n + 1, collLenMap)
return collLenMap[n]
def collatzLen(n):
# Declare empty Map / Dict
# to store collatz lengths
collLenMap = {}
collatzLenUtil(n, collLenMap)
# Initalise ans and
# its collatz length
num, l =-1, 0
for i in range(1, n):
# If value not already computed,
# pass Dict to Helper function
# and calculate and store value
if i not in collLenMap:
collatzLenUtil(i, collLenMap)
cLen = collLenMap[i]
if l < cLen:
l = cLen
num = i
# Return ans and
# its collatz length
return (num, l)
print(collatzLen(10))
输出:
(9, 20)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。