Given an array of integers, replace every element with the next greatest element (greatest element on the right side) in the array. Since there is no element next to the last element, replace it with -1. For example, if the array is {16, 17, 4, 3, 5, 2}, then it should be modified to {17, 5, 5, 5, 2, -1}.
The question is very similar to this post and solutions are also similar.
A Naive method is to run two loops. The outer loop will one by one pick array elements from left to right. The inner loop will find the greatest element present after the picked element. Finally the outer loop will replace the picked element with the greatest element found by inner loop. The time complexity of this method will be O(n*n).
C++
#include <bits/stdc++.h>
using namespace std;
void nextGreatest( int arr[], int n){
for ( int i = 0; i<n; i++){
int max_value = -1;
for ( int j = i+1; j<n; j++){
max_value = max(max_value, arr[j]);
}
arr[i] = max_value;
}
}
void printArray( int arr[], int size){
for ( int i = 0; i < size; i++)
cout << arr[i] << " " ;
cout << endl;
}
int main(){
int arr[] = {16, 17, 4, 3, 5, 2};
int size = sizeof (arr)/ sizeof (arr[0]);
nextGreatest (arr, size);
cout << "The modified array is: \n" ;
printArray (arr, size);
return (0);
}
|
Java
class Main {
static void nextGreatest( int arr[], int n)
{
for ( int i = 0 ; i < n; i++) {
int max_value = - 1 ;
for ( int j = i + 1 ; j < n; j++) {
max_value = Math.max(max_value, arr[j]);
}
arr[i] = max_value;
}
}
static void printArray( int arr[], int size)
{
for ( int i = 0 ; i < size; i++)
System.out.print(arr[i] + " " );
System.out.println();
}
public static void main(String[] args)
{
int arr[] = { 16 , 17 , 4 , 3 , 5 , 2 };
int size = arr.length;
nextGreatest(arr, size);
System.out.println( "The modified array is: " );
printArray(arr, size);
}
}
|
Python3
def nextGreatest(arr, n):
for i in range (n):
max_value = - 1
for j in range (i + 1 , n):
max_value = max (max_value, arr[j])
arr[i] = max_value
def printArray(arr, size):
for i in range (size):
print (arr[i], end = " " )
print ()
if __name__ = = '__main__' :
arr = [ 16 , 17 , 4 , 3 , 5 , 2 ]
size = len (arr)
nextGreatest(arr, size)
print ( "The modified array is:" )
printArray(arr, size)
|
C#
using System;
public class MainClass
{
static void NextGreatest( int [] arr, int n)
{
for ( int i = 0; i < n; i++)
{
int max_value = -1;
for ( int j = i + 1; j < n; j++)
{
max_value = Math.Max(max_value, arr[j]);
}
arr[i] = max_value;
}
}
static void PrintArray( int [] arr, int size)
{
for ( int i = 0; i < size; i++)
{
Console.Write(arr[i] + " " );
}
Console.WriteLine();
}
public static void Main( string [] args)
{
int [] arr = { 16, 17, 4, 3, 5, 2 };
int size = arr.Length;
NextGreatest(arr, size);
Console.WriteLine( "The modified array is: " );
PrintArray(arr, size);
}
}
|
Javascript
function nextGreatest(arr, n) {
for (let i = 0; i < n; i++) {
let max_value = -1;
for (let j = i + 1; j < n; j++) {
max_value = Math.max(max_value, arr[j]);
}
arr[i] = max_value;
}
}
function printArray(arr, size) {
for (let i = 0; i < size; i++) {
console.log(arr[i] + " " );
}
console.log( "\n" );
}
let arr = [16, 17, 4, 3, 5, 2];
let size = arr.length;
nextGreatest(arr, size);
console.log( "The modified array is: " );
printArray(arr, size);
|
OutputThe modified array is:
17 5 5 5 2 -1
Time Complexity: O(N^2)
Auxiliary Space: O(1)
A tricky method is to replace all elements using one traversal of the array. The idea is to start from the rightmost element, move to the left side one by one, and keep track of the maximum element. Replace every element with the maximum element.
C++
#include <bits/stdc++.h>
using namespace std;
void nextGreatest( int arr[], int size)
{
int maxFromRight = -1;
int n = size;
for ( int i= n-1; i>=0;i--) {
int temp = maxFromRight;
if (arr[i]> maxFromRight){
maxFromRight = arr[i];
}
arr[i] = temp;
}
return ;
}
void printArray( int arr[], int size)
{
int i;
for (i = 0; i < size; i++)
cout << arr[i] << " " ;
cout << endl;
}
int main()
{
int arr[] = {16, 17, 4, 3, 5, 2};
int size = sizeof (arr)/ sizeof (arr[0]);
nextGreatest (arr, size);
cout << "The modified array is: \n" ;
printArray (arr, size);
return (0);
}
|
C
#include <stdio.h>
void nextGreatest( int arr[], int size)
{
int max_from_right = arr[size-1];
arr[size-1] = -1;
for ( int i = size-2; i >= 0; i--)
{
int temp = arr[i];
arr[i] = max_from_right;
if (max_from_right < temp)
max_from_right = temp;
}
}
void printArray( int arr[], int size)
{
int i;
for (i=0; i < size; i++)
printf ( "%d " , arr[i]);
printf ( "\n" );
}
int main()
{
int arr[] = {16, 17, 4, 3, 5, 2};
int size = sizeof (arr)/ sizeof (arr[0]);
nextGreatest (arr, size);
printf ( "The modified array is: \n" );
printArray (arr, size);
return (0);
}
|
Java
import java.io.*;
class NextGreatest
{
static void nextGreatest( int arr[])
{
int size = arr.length;
int max_from_right = arr[size- 1 ];
arr[size- 1 ] = - 1 ;
for ( int i = size- 2 ; i >= 0 ; i--)
{
int temp = arr[i];
arr[i] = max_from_right;
if (max_from_right < temp)
max_from_right = temp;
}
}
static void printArray( int arr[])
{
for ( int i= 0 ; i < arr.length; i++)
System.out.print(arr[i]+ " " );
}
public static void main (String[] args)
{
int arr[] = { 16 , 17 , 4 , 3 , 5 , 2 };
nextGreatest (arr);
System.out.println( "The modified array:" );
printArray (arr);
}
}
|
Python3
def nextGreatest(arr):
size = len (arr)
max_from_right = arr[size - 1 ]
arr[size - 1 ] = - 1
for i in range (size - 2 , - 1 , - 1 ):
temp = arr[i]
arr[i] = max_from_right
if max_from_right< temp:
max_from_right = temp
def printArray(arr):
for i in range ( 0 , len (arr)):
print (arr[i],end = " " )
arr = [ 16 , 17 , 4 , 3 , 5 , 2 ]
nextGreatest(arr)
print ( "Modified array is" )
printArray(arr)
|
C#
using System;
class GFG {
static void nextGreatest( int []arr)
{
int size = arr.Length;
int max_from_right = arr[size-1];
arr[size-1] = -1;
for ( int i = size-2; i >= 0; i--)
{
int temp = arr[i];
arr[i] = max_from_right;
if (max_from_right < temp)
max_from_right = temp;
}
}
static void printArray( int []arr)
{
for ( int i=0; i < arr.Length; i++)
Console.Write(arr[i]+ " " );
}
public static void Main ()
{
int []arr = {16, 17, 4, 3, 5, 2};
nextGreatest (arr);
Console.WriteLine( "The modified array:" );
printArray (arr);
}
}
|
PHP
<?php
function nextGreatest(& $arr , $size )
{
$max_from_right = $arr [ $size - 1];
$arr [ $size - 1] = -1;
for ( $i = $size - 2; $i >= 0; $i --)
{
$temp = $arr [ $i ];
$arr [ $i ] = $max_from_right ;
if ( $max_from_right < $temp )
$max_from_right = $temp ;
}
}
function printArray( $arr , $size )
{
for ( $i = 0; $i < $size ; $i ++)
echo $arr [ $i ] . " " ;
echo "\n" ;
}
$arr = array (16, 17, 4, 3, 5, 2);
$size = count ( $arr );
nextGreatest ( $arr , $size );
echo "The modified array is: \n" ;
printArray ( $arr , $size );
?>
|
Javascript
<script>
function nextGreatest(arr,size)
{
max_from_right = arr[size-1];
arr[size-1] = -1;
for (let i = size-2; i >= 0; i--)
{
temp = arr[i];
arr[i] = max_from_right;
if (max_from_right < temp)
max_from_right = temp;
}
}
function printArray(arr,size)
{
var i;
for ( let i = 0; i < size; i++)
document.write(arr[i] + " " );
}
arr = new Array (16, 17, 4, 3, 5, 2);
size = arr.length;
nextGreatest (arr, size);
document.write ( "The modified array is: " + "<br>" + " \n" );
printArray (arr, size);
</script>
|
Output:
The modified array is:
17 5 5 5 2 -1
Time Complexity: O(n) where n is the number of elements in array.
Auxiliary Space: O(1)
Please write comments if you find any of the above codes/algorithms incorrect, or find other ways to solve the same problem.