Given an array of integers, our task is to write a program that efficiently finds the second-largest element present in the array.
Examples:
Input: arr[] = {12, 35, 1, 10, 34, 1}
Output: The second largest element is 34.
Explanation: The largest element of the array is 35 and the second largest element is 34
Input: arr[] = {10, 5, 10}
Output: The second largest element is 5.
Explanation: The largest element of the array is 10 and the second largest element is 5
Input: arr[] = {10, 10, 10}
Output: The second largest does not exist.
Explanation: Largest element of the array is 10 there is no second largest element
Find Second Largest element using Sorting:
The idea is to sort the array in descending order and then return the second element which is not equal to the largest element from the sorted array.
Below is the implementation of the above idea:
C++
#include <bits/stdc++.h>
using namespace std;
void print2largest( int arr[], int arr_size)
{
sort(arr, arr + arr_size, greater< int >());
for ( int i = 1; i < arr_size; i++) {
if (arr[i] != arr[0]) {
printf ( "The second largest element is %d\n" ,
arr[i]);
return ;
}
}
printf ( "There is no second largest element\n" );
}
int main()
{
int arr[] = { 12, 35, 1, 10, 34, 1 };
int n = sizeof (arr) / sizeof (arr[0]);
print2largest(arr, n);
return 0;
}
|
C
#include <stdio.h>
#include <stdlib.h>
int cmpfunc( const void * a, const void * b)
{
return (*( int *)b - *( int *)a);
}
void print2largest( int arr[], int arr_size)
{
qsort (arr, arr_size, sizeof ( int ), cmpfunc);
for ( int i = 1; i < arr_size; i++) {
if (arr[i] != arr[0]) {
printf ( "The second largest element is %d\n" ,
arr[i]);
return ;
}
}
printf ( "There is no second largest element\n" );
}
int main()
{
int arr[] = { 12, 35, 1, 10, 34, 1 };
int n = sizeof (arr) / sizeof (arr[0]);
print2largest(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG {
static void print2largest(Integer arr[], int arr_size)
{
Arrays.sort(arr, Collections.reverseOrder());
for ( int i = 1 ; i < arr_size; i++) {
if (arr[i] != arr[ 0 ]) {
System.out.printf( "The second largest "
+ "element is %d\n" ,
arr[i]);
return ;
}
}
System.out.printf( "There is no second "
+ "largest element\n" );
}
public static void main(String[] args)
{
Integer arr[] = { 12 , 35 , 1 , 10 , 34 , 1 };
int n = arr.length;
print2largest(arr, n);
}
}
|
Python3
def print2largest(arr, arr_size):
arr.sort(reverse = True )
for i in range ( 1 , arr_size):
if (arr[i] ! = arr[ 0 ]):
print ( "The second largest element is" , arr[i])
return
print ( "There is no second largest element" )
arr = [ 12 , 35 , 1 , 10 , 34 , 1 ]
n = len (arr)
print2largest(arr, n)
|
C#
using System;
class GFG{
static void print2largest( int []arr,
int arr_size)
{
Array.Sort(arr);
Array.Reverse(arr);
for ( int i = 1; i < arr_size; i--)
{
if (arr[i] != arr[0])
{
Console.Write( "The second largest " +
"element is {0}\n" , arr[i]);
return ;
}
}
Console.Write( "There is no second " +
"largest element\n" );
}
public static void Main(String[] args)
{
int []arr = { 12, 35, 1, 10, 34, 1 };
int n = arr.Length;
print2largest(arr, n);
}
}
|
Javascript
<script>
function print2largest(arr, arr_size) {
arr.sort();
arr.reverse();
for (let i = 1; i < arr_size; i--) {
if (arr[i] != arr[0]) {
document.write( "The second largest element is " + arr[i]);
return ;
}
}
document.write( "There is no second largest element<br>" );
}
let arr= [ 12, 35, 1, 10, 34, 1 ];
let n = arr.length;
print2largest(arr, n);
</script>
|
Output
The second largest element is 34
Time Complexity: O(nlogn), where n is the size of input array.
Auxiliary space: O(1), as no extra space is required.
Find Second Largest element by traversing the array twice (Two Pass):
The approach is to traverse the array twice. In the first traversal, find the maximum element. In the second traversal, find the greatest element excluding the previous greatest.
Below is the implementation of the above idea:
C++14
#include <iostream>
using namespace std;
int secondLargest( int arr[], int n) {
int largest = 0, secondLargest = -1;
for ( int i = 1; i < n; i++) {
if (arr[i] > arr[largest])
largest = i;
}
for ( int i = 0; i < n; i++) {
if (arr[i] != arr[largest]) {
if (secondLargest == -1)
secondLargest = i;
else if (arr[i] > arr[secondLargest])
secondLargest = i;
}
}
return secondLargest;
}
int main() {
int arr[] = { 12, 35, 1, 10, 34, 1 };
int n = sizeof (arr)/ sizeof (arr[0]);
int second_Largest = secondLargest(arr, n);
if (second_Largest == -1)
cout << "Second largest didn't exit\n" ;
else
cout << "Second largest : " << arr[second_Largest];
}
|
Java
import java.io.*;
class GFG{
static void print2largest( int arr[], int arr_size)
{
int i, first, second;
if (arr_size < 2 )
{
System.out.printf( " Invalid Input " );
return ;
}
int largest = second = Integer.MIN_VALUE;
for (i = 0 ; i < arr_size; i++)
{
largest = Math.max(largest, arr[i]);
}
for (i = 0 ; i < arr_size; i++)
{
if (arr[i] != largest)
second = Math.max(second, arr[i]);
}
if (second == Integer.MIN_VALUE)
System.out.printf( "There is no second " +
"largest element\n" );
else
System.out.printf( "The second largest " +
"element is %d\n" , second);
}
public static void main(String[] args)
{
int arr[] = { 12 , 35 , 1 , 10 , 34 , 1 };
int n = arr.length;
print2largest(arr, n);
}
}
|
Python3
def print2largest(arr, arr_size):
if (arr_size < 2 ):
print ( " Invalid Input " );
return ;
largest = second = - 2454635434 ;
for i in range ( 0 , arr_size):
largest = max (largest, arr[i]);
for i in range ( 0 , arr_size):
if (arr[i] ! = largest):
second = max (second, arr[i]);
if (second = = - 2454635434 ):
print ( "There is no second " +
"largest element" );
else :
print ( "The second largest " +
"element is \n" , second);
if __name__ = = '__main__' :
arr = [ 12 , 35 , 1 ,
10 , 34 , 1 ];
n = len (arr);
print2largest(arr, n);
|
C#
using System;
class GFG{
static void print2largest( int []arr, int arr_size)
{
int i, second;
if (arr_size < 2)
{
Console.Write( " Invalid Input " );
return ;
}
int largest = second = int .MinValue;
for (i = 0; i < arr_size; i++)
{
largest = Math.Max(largest, arr[i]);
}
for (i = 0; i < arr_size; i++)
{
if (arr[i] != largest)
second = Math.Max(second, arr[i]);
}
if (second == int .MinValue)
Console.Write( "There is no second " +
"largest element\n" );
else
Console.Write( "The second largest " +
"element is {0}\n" , second);
}
public static void Main(String[] args)
{
int []arr = { 12, 35, 1, 10, 34, 1 };
int n = arr.Length;
print2largest(arr, n);
}
}
|
Javascript
<script>
function print2largest(arr, arr_size) {
let i;
let largest = second = -2454635434;
if (arr_size < 2) {
document.write( " Invalid Input " );
return ;
}
for (i = 0;i<arr_size;i++){
if (arr[i]>largest){
largest = arr[i];
}
}
for (i = 0 ;i<arr_size;i++){
if (arr[i]>second && arr[i]<largest){
second = arr[i];
}
}
if (second == -2454635434){
document.write( "There is no second largest element<br>" );
}
else {
document.write( "The second largest element is " + second);
return ;
}
}
let arr= [ 12, 35, 1, 10, 34, 1 ];
let n = arr.length;
print2largest(arr, n);
</script>
|
Output
Second largest : 34
Time Complexity: O(n), where n is the size of input array.
Auxiliary space: O(1), as no extra space is required.
Find Second Largest element by traversing the array once (One Pass):
The idea is to keep track of the largest and second largest element while traversing the array. If an element is greater than the largest element, we update the largest as well as the second largest. Else if an element is smaller than largest but greater than second largest, then we update the second largest only.
Below is the complete algorithm for doing this:
- Initialize the first as 0(i.e, index of arr[0] element
- Start traversing the array from array[1],
- If the current element in array say arr[i] is greater than first. Then update first and second as, second = first and first = arr[i]
- If the current element is in between first and second, then update second to store the value of current variable as second = arr[i]
- Return the value stored in second.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
int secondLargest( int arr[], int n) {
int first = 0, second = -1;
for ( int i = 1; i < n; i++) {
if (arr[i] > arr[first]) {
second = first;
first = i;
}
else if (arr[i] < arr[first]) {
if (second == -1 || arr[second] < arr[i])
second = i;
}
}
return second;
}
int main() {
int arr[] = { 12, 35, 1, 10, 34, 1 };
int index = secondLargest(arr, sizeof (arr)/ sizeof (arr[0]));
if (index == -1)
cout << "Second Largest didn't exist" ;
else
cout << "Second largest : " << arr[index];
}
|
C
#include <limits.h>
#include <stdio.h>
void print2largest( int arr[], int arr_size)
{
int i, first, second;
if (arr_size < 2) {
printf ( " Invalid Input " );
return ;
}
first = second = INT_MIN;
for (i = 0; i < arr_size; i++) {
if (arr[i] > first) {
second = first;
first = arr[i];
}
else if (arr[i] > second && arr[i] != first)
second = arr[i];
}
if (second == INT_MIN)
printf ( "There is no second largest element\n" );
else
printf ( "The second largest element is %d" , second);
}
int main()
{
int arr[] = { 12, 35, 1, 10, 34, 1 };
int n = sizeof (arr) / sizeof (arr[0]);
print2largest(arr, n);
return 0;
}
|
Java
import java.io.*;
class GFG {
public static void print2largest( int arr[],
int arr_size)
{
int i, first, second;
if (arr_size < 2 ) {
System.out.print( " Invalid Input " );
return ;
}
first = second = Integer.MIN_VALUE;
for (i = 0 ; i < arr_size; i++) {
if (arr[i] > first) {
second = first;
first = arr[i];
}
else if (arr[i] > second && arr[i] != first)
second = arr[i];
}
if (second == Integer.MIN_VALUE)
System.out.print( "There is no second largest"
+ " element\n" );
else
System.out.print( "The second largest element"
+ " is " + second);
}
public static void main(String[] args)
{
int arr[] = { 12 , 35 , 1 , 10 , 34 , 1 };
int n = arr.length;
print2largest(arr, n);
}
}
|
Python3
def print2largest(arr, arr_size):
if (arr_size < 2 ):
print ( " Invalid Input " )
return
first = second = - 2147483648
for i in range (arr_size):
if (arr[i] > first):
second = first
first = arr[i]
elif (arr[i] > second and arr[i] ! = first):
second = arr[i]
if (second = = - 2147483648 ):
print ( "There is no second largest element" )
else :
print ( "The second largest element is" , second)
arr = [ 12 , 35 , 1 , 10 , 34 , 1 ]
n = len (arr)
print2largest(arr, n)
|
C#
using System;
class GFG {
public static void print2largest( int [] arr,
int arr_size)
{
int i, first, second;
if (arr_size < 2) {
Console.WriteLine( " Invalid Input " );
return ;
}
first = second = int .MinValue;
for (i = 0; i < arr_size; i++) {
if (arr[i] > first) {
second = first;
first = arr[i];
}
else if (arr[i] > second && arr[i] != first)
second = arr[i];
}
if (second == int .MinValue)
Console.Write( "There is no second largest"
+ " element\n" );
else
Console.Write( "The second largest element"
+ " is " + second);
}
public static void Main(String[] args)
{
int [] arr = { 12, 35, 1, 10, 34, 1 };
int n = arr.Length;
print2largest(arr, n);
}
}
|
Javascript
<script>
function print2largest(arr, arr_size) {
let i;
let largest = second = -2454635434;
if (arr_size < 2) {
document.write( " Invalid Input " );
return ;
}
for (i = 0 ;i<arr_size;i++){
if (arr[i]>largest){
second = largest ;
largest = arr[i]
}
else if (arr[i]!=largest && arr[i]>second ){
second = arr[i];
}
}
if (second == -2454635434){
document.write( "There is no second largest element<br>" );
}
else {
document.write( "The second largest element is " + second);
return ;
}
}
let arr= [ 12, 35, 1, 10, 34, 1 ];
let n = arr.length;
print2largest(arr, n);
</script>
|
PHP
<?php
function print2largest( $arr , $arr_size )
{
if ( $arr_size < 2)
{
echo ( " Invalid Input " );
return ;
}
$first = $second = PHP_INT_MIN;
for ( $i = 0; $i < $arr_size ; $i ++)
{
if ( $arr [ $i ] > $first )
{
$second = $first ;
$first = $arr [ $i ];
}
else if ( $arr [ $i ] > $second &&
$arr [ $i ] != $first )
$second = $arr [ $i ];
}
if ( $second == PHP_INT_MIN)
echo ( "There is no second largest element\n" );
else
echo ( "The second largest element is " . $second . "\n" );
}
$arr = array (12, 35, 1, 10, 34, 1);
$n = sizeof( $arr );
print2largest( $arr , $n );
?>
|
Output
Second largest : 34
Time Complexity: O(n), where n is the size of input array.
Auxiliary space: O(1), as no extra space is required.
Related Article:
Smallest and second smallest element in an array
This article is contributed by Harsh Agarwal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
22 Nov, 2023
Like Article
Save Article