Find the largest element in an array generated using the given conditions
Given an integer N (2 ? N ? 1e6), the task is to find the maximum element present in the array arr[] of size N + 1 generated based on the following steps:
- arr[0] = 0
- arr[1] = 1
- arr[2 * i] = arr[i], when 2 ? 2 * i ? N
- arr[2 * i + 1] = Arr[i] + Arr[i + 1] when 2 ? 2 * i + 1 ? N
Examples:
Input: N = 7
Output: 3
Explanation: Constructing the array based on the given rules:
- Arr[0] = 0
- Arr[1] = 1
- Arr[(1 * 2) = 2] = Arr[1] = 1
- Arr[(1 * 2) + 1 = 3] = Arr[1] + Arr[2] = 1 + 1 = 2
- Arr[(2 * 2) = 4] = Arr[2] = 1
- Arr[(2 * 2) + 1 = 5] = Arr[2] + Arr[3] = 1 + 2 = 3
- Arr[(3 * 2) = 6] = Arr[3] = 2
- Arr[(3 * 2) + 1 = 7] = Arr[3] + Arr[4] = 2 + 1 = 3
Therefore, the array constructed is {0, 1, 1, 2, 1, 3, 2, 3}. The maximum element present in the array is 3.
Input: N = 2
Output: 1
Explanation: According to the given rules, the maximum among Arr[0], Arr[1], and Arr[2] is 1.
Approach: To solve the problem, the idea is to generate all the array elements based on the given set of rules and then, find the maximum among them. Find every array element iteratively using the following steps:
If i is even: Arr[i] = Arr[i/2]
Otherwise, if i is odd: Arr[i] = Arr[(i – 1)/2] + Arr[(i – 1)/2 +1]
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
vector< int > findArray( int n)
{
vector< int > Arr(n + 1);
Arr[0] = 0;
Arr[1] = 1;
for ( int i = 2; i <= n; i++) {
if (i % 2 == 0) {
Arr[i] = Arr[i / 2];
}
else {
Arr[i]
= Arr[(i - 1) / 2]
+ Arr[(i - 1) / 2 + 1];
}
}
return Arr;
}
int maxElement( int n)
{
if (n == 0)
return 0;
if (n == 1)
return 1;
vector< int > Arr = findArray(n);
return *max_element(
Arr.begin(), Arr.end());
}
int main()
{
int N = 7;
cout << maxElement(N);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
import java.util.Arrays;
class GFG{
static int [] findArray( int n)
{
int Arr[] = new int [n + 1 ];
Arr[ 0 ] = 0 ;
Arr[ 1 ] = 1 ;
for ( int i = 2 ; i <= n; i++)
{
if (i % 2 == 0 )
{
Arr[i] = Arr[i / 2 ];
}
else
{
Arr[i] = Arr[(i - 1 ) / 2 ] +
Arr[(i - 1 ) / 2 + 1 ];
}
}
return Arr;
}
static int maxElement( int n)
{
if (n == 0 )
return 0 ;
if (n == 1 )
return 1 ;
int [] Arr = findArray(n);
int ans = Integer.MIN_VALUE;
for ( int i = 0 ; i < n; i++)
{
ans = Math.max(ans, Arr[i]);
}
return ans;
}
public static void main(String args[])
{
int N = 7 ;
System.out.println(maxElement(N));
}
}
|
Python3
def findArray(n):
Arr = [ 0 ] * (n + 1 )
Arr[ 1 ] = 1
for i in range ( 2 , n + 1 ):
if (i % 2 = = 0 ):
Arr[i] = Arr[i / / 2 ]
else :
Arr[i] = (Arr[(i - 1 ) / / 2 ] +
Arr[(i - 1 ) / / 2 + 1 ])
return Arr
def maxElement(n):
if (n = = 0 ):
return 0
if (n = = 1 ):
return 1
Arr = findArray(n)
return max (Arr)
if __name__ = = "__main__" :
N = 7
print (maxElement(N))
|
C#
using System;
class GFG
{
static int [] findArray( int n)
{
int []Arr = new int [n + 1];
Arr[0] = 0;
Arr[1] = 1;
for ( int i = 2; i <= n; i++)
{
if (i % 2 == 0)
{
Arr[i] = Arr[i / 2];
}
else
{
Arr[i] = Arr[(i - 1) / 2] +
Arr[(i - 1) / 2 + 1];
}
}
return Arr;
}
static int maxElement( int n)
{
if (n == 0)
return 0;
if (n == 1)
return 1;
int [] Arr = findArray(n);
int ans = int .MinValue;
for ( int i = 0; i < n; i++)
{
ans = Math.Max(ans, Arr[i]);
}
return ans;
}
public static void Main(String []args)
{
int N = 7;
Console.WriteLine(maxElement(N));
}
}
|
Javascript
<script>
function findArray(n)
{
let Arr = Array.from({length: n+1}, (_, i) => 0);
Arr[0] = 0;
Arr[1] = 1;
for (let i = 2; i <= n; i++)
{
if (i % 2 == 0)
{
Arr[i] = Arr[i / 2];
}
else
{
Arr[i] = Arr[(i - 1) / 2] +
Arr[(i - 1) / 2 + 1];
}
}
return Arr;
}
function maxElement(n)
{
if (n == 0)
return 0;
if (n == 1)
return 1;
let Arr = findArray(n);
let ans = Number.MIN_VALUE;
for (let i = 0; i < n; i++)
{
ans = Math.max(ans, Arr[i]);
}
return ans;
}
let N = 7;
document.write(maxElement(N));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Last Updated :
29 Apr, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...