Given an integer N. The task is to find the number in the range from 1 to N-1 which is having the maximum number of terms in its Collatz Sequence and the number of terms in the sequence. The collatz sequence of a number N is defined as:
- If N is Odd then change N to 3*N + 1.
- If N is Even then change N to N / 2.
For example let us have a look at the sequence when N = 13: 13 -> 40 -> 20 -> 10 -> 5 > 16 -> 8 -> 4 -> 2 -> 1 Examples:
Input: 10 Output: (9, 20) 9 has 20 terms in its Collatz sequence Input: 50 Output: (27, 112) 27 has 112 terms
Approach: As in the above example discussed for N = 13, collatz sequence for N = 13 and N = 40 have similar terms except one, that ensures there may be an involvement of dynamic programming to store the answer for subproblems and reuse it. But here normal memoization will not work because at one step we are either making a number large from itself ( in above example N = 13 is depending upon the solution of N = 40 ) or dividing by 2 ( N = 40 solution depends upon the solution of N = 20 ). So instead of using a dp array we will use a Map/ dictionary data structure to store the solution of subproblems and will perform the normal operation as discussed in the collatz sequence. Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
int collatzLenUtil( int n, unordered_map< int , int >&collLenMap){
if (collLenMap.find(n) != collLenMap.end())
return collLenMap[n];
if (n == 1)
collLenMap[n] = 1;
else if (n % 2 == 0){
collLenMap[n] = 1 + collatzLenUtil(n/2 , collLenMap);
}
else {
collLenMap[n] = 1 + collatzLenUtil(3 * n + 1, collLenMap);
}
return collLenMap[n];
}
pair< int , int > collatzLen( int n){
unordered_map< int , int >collLenMap;
collatzLenUtil(n, collLenMap);
int num = -1, l = 0;
for ( int i=1;i<n;i++){
if (collLenMap.find(i)==collLenMap.end())
collatzLenUtil(i, collLenMap);
int cLen = collLenMap[i];
if (l < cLen){
l = cLen;
num = i;
}
}
return {num, l};
}
int main(){
cout<< "(" <<collatzLen(10).first<< ", " <<collatzLen(10).second<< ")" <<endl;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
static int collatzLenUtil( int n, HashMap<Integer,Integer>collLenMap){
if (collLenMap.containsKey(n))
return collLenMap.get(n);
if (n == 1 )
collLenMap.put(n , 1 );
else if (n % 2 == 0 ){
collLenMap.put(n , 1 + collatzLenUtil(n/ 2 , collLenMap));
}
else {
collLenMap.put(n , 1 + collatzLenUtil( 3 * n + 1 , collLenMap));
}
return collLenMap.get(n);
}
static int [] collatzLen( int n){
HashMap<Integer,Integer> collLenMap = new HashMap<>();
collatzLenUtil(n, collLenMap);
int num = - 1 , l = 0 ;
for ( int i= 1 ;i<n;i++){
if (collLenMap.containsKey(i)== false )
collatzLenUtil(i, collLenMap);
int cLen = collLenMap.get(i);
if (l < cLen){
l = cLen;
num = i;
}
}
int res[] = {num, l};
return res;
}
public static void main(String args[])
{
System.out.println( "(" + collatzLen( 10 )[ 0 ]+ ", " +collatzLen( 10 )[ 1 ] + ")" );
}
}
|
Python3
def collatzLenUtil(n, collLenMap):
if n in collLenMap:
return collLenMap[n]
if (n = = 1 ):
collLenMap[n] = 1
elif (n % 2 = = 0 ):
collLenMap[n] \
= 1 \
+ collatzLenUtil(n / / 2 , collLenMap)
else :
collLenMap[n] \
= 1 \
+ collatzLenUtil( 3 * n + 1 , collLenMap)
return collLenMap[n]
def collatzLen(n):
collLenMap = {}
collatzLenUtil(n, collLenMap)
num, l = - 1 , 0
for i in range ( 1 , n):
if i not in collLenMap:
collatzLenUtil(i, collLenMap)
cLen = collLenMap[i]
if l < cLen:
l = cLen
num = i
return (num, l)
print (collatzLen( 10 ))
|
C#
using System;
using System.Collections.Generic;
class GFG {
static int
collatzLenUtil( int n, Dictionary< int , int > collLenMap)
{
if (collLenMap.ContainsKey(n))
return collLenMap[n];
if (n == 1)
collLenMap.Add(n, 1);
else if (n % 2 == 0) {
collLenMap.Add(
n, 1 + collatzLenUtil(n / 2, collLenMap));
}
else {
collLenMap.Add(
n,
1 + collatzLenUtil(3 * n + 1, collLenMap));
}
return collLenMap[n];
}
static int [] collatzLen( int n)
{
Dictionary< int , int > collLenMap
= new Dictionary< int , int >();
collatzLenUtil(n, collLenMap);
int num = -1, l = 0;
for ( int i = 1; i < n; i++) {
if (collLenMap.ContainsKey(i) == false )
collatzLenUtil(i, collLenMap);
int cLen = collLenMap[i];
if (l < cLen) {
l = cLen;
num = i;
}
}
int [] res = { num, l };
return res;
}
public static void Main( string [] args)
{
Console.WriteLine( "(" + collatzLen(10)[0] + ", "
+ collatzLen(10)[1] + ")" );
}
}
|
Javascript
<script>
function collatzLenUtil(n, collLenMap){
if (collLenMap.has(n))
return collLenMap.get(n)
if (n == 1)
collLenMap.set(n, 1)
else if (n % 2 == 0){
collLenMap.set(n , 1 + collatzLenUtil(Math.floor(n/2) , collLenMap))
}
else {
collLenMap.set(n , 1 + collatzLenUtil(3 * n + 1, collLenMap))
}
return collLenMap.get(n);
}
function collatzLen(n){
let collLenMap = new Map()
collatzLenUtil(n, collLenMap)
let num = -1, l = 0
for (let i=1;i<n;i++){
if (collLenMap.has(i)== false )
collatzLenUtil(i, collLenMap)
let cLen = collLenMap.get(i)
if (l < cLen){
l = cLen
num = i
}
}
return [num, l]
}
document.write(collatzLen(10))
</script>
|
Time Complexity: O(n*log(n))
Auxiliary Space: O(n)
|