Given an array of integers arr[], the task is to print a list of all the peaks and another list of all the troughs present in the array. A peak is an element in the array which is greater than its neighbouring elements. Similarly, a trough is an element that is smaller than its neighbouring elements.
Examples:
Input: arr[] = {5, 10, 5, 7, 4, 3, 5}
Output:
Peaks : 10 7 5
Troughs : 5 5 3
Input: arr[] = {1, 2, 3, 4, 5}
Output:
Peaks : 5
Troughs : 1
Approach: For every element of the array, check whether the current element is a peak (the element has to be greater than its neighbouring elements) or a trough (the element has to be smaller than its neighbouring elements).
Note that the first and the last element of the array will have a single neighbour.
Below is the implementation of the above approach:
// C++ implementation of the approach #include <iostream> using namespace std;
// Function that returns true if num is // greater than both arr[i] and arr[j] static bool isPeak( int arr[], int n, int num,
int i, int j)
{ // If num is smaller than the element
// on the left (if exists)
if (i >= 0 && arr[i] > num)
return false ;
// If num is smaller than the element
// on the right (if exists)
if (j < n && arr[j] > num)
return false ;
return true ;
} // Function that returns true if num is // smaller than both arr[i] and arr[j] static bool isTrough( int arr[], int n, int num,
int i, int j)
{ // If num is greater than the element
// on the left (if exists)
if (i >= 0 && arr[i] < num)
return false ;
// If num is greater than the element
// on the right (if exists)
if (j < n && arr[j] < num)
return false ;
return true ;
} void printPeaksTroughs( int arr[], int n)
{ cout << "Peaks : " ;
// For every element
for ( int i = 0; i < n; i++) {
// If the current element is a peak
if (isPeak(arr, n, arr[i], i - 1, i + 1))
cout << arr[i] << " " ;
}
cout << endl;
cout << "Troughs : " ;
// For every element
for ( int i = 0; i < n; i++) {
// If the current element is a trough
if (isTrough(arr, n, arr[i], i - 1, i + 1))
cout << arr[i] << " " ;
}
} // Driver code int main()
{ int arr[] = { 5, 10, 5, 7, 4, 3, 5 };
int n = sizeof (arr) / sizeof (arr[0]);
printPeaksTroughs(arr, n);
return 0;
} |
// Java implementation of the approach import java.util.*;
class GFG
{ // Function that returns true if num is
// greater than both arr[i] and arr[j]
static boolean isPeak( int arr[], int n, int num,
int i, int j)
{
// If num is smaller than the element
// on the left (if exists)
if (i >= 0 && arr[i] > num)
{
return false ;
}
// If num is smaller than the element
// on the right (if exists)
if (j < n && arr[j] > num)
{
return false ;
}
return true ;
}
// Function that returns true if num is
// smaller than both arr[i] and arr[j]
static boolean isTrough( int arr[], int n, int num,
int i, int j)
{
// If num is greater than the element
// on the left (if exists)
if (i >= 0 && arr[i] < num)
{
return false ;
}
// If num is greater than the element
// on the right (if exists)
if (j < n && arr[j] < num)
{
return false ;
}
return true ;
}
static void printPeaksTroughs( int arr[], int n)
{
System.out.print( "Peaks : " );
// For every element
for ( int i = 0 ; i < n; i++)
{
// If the current element is a peak
if (isPeak(arr, n, arr[i], i - 1 , i + 1 ))
{
System.out.print(arr[i] + " " );
}
}
System.out.println( "" );
System.out.print( "Troughs : " );
// For every element
for ( int i = 0 ; i < n; i++)
{
// If the current element is a trough
if (isTrough(arr, n, arr[i], i - 1 , i + 1 ))
{
System.out.print(arr[i] + " " );
}
}
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 5 , 10 , 5 , 7 , 4 , 3 , 5 };
int n = arr.length;
printPeaksTroughs(arr, n);
}
} // This code is contributed by Rajput-Ji |
# Python3 implementation of the approach # Function that returns true if num is # greater than both arr[i] and arr[j] def isPeak(arr, n, num, i, j):
# If num is smaller than the element
# on the left (if exists)
if (i > = 0 and arr[i] > num):
return False
# If num is smaller than the element
# on the right (if exists)
if (j < n and arr[j] > num):
return False
return True
# Function that returns true if num is # smaller than both arr[i] and arr[j] def isTrough(arr, n, num, i, j):
# If num is greater than the element
# on the left (if exists)
if (i > = 0 and arr[i] < num):
return False
# If num is greater than the element
# on the right (if exists)
if (j < n and arr[j] < num):
return False
return True
def printPeaksTroughs(arr, n):
print ( "Peaks : " , end = "")
# For every element
for i in range (n):
# If the current element is a peak
if (isPeak(arr, n, arr[i], i - 1 , i + 1 )):
print (arr[i], end = " " )
print ()
print ( "Troughs : " , end = "")
# For every element
for i in range (n):
# If the current element is a trough
if (isTrough(arr, n, arr[i], i - 1 , i + 1 )):
print (arr[i], end = " " )
# Driver code arr = [ 5 , 10 , 5 , 7 , 4 , 3 , 5 ]
n = len (arr)
printPeaksTroughs(arr, n) # This code is contributed by Mohit Kumar |
// C# implementation of the approach using System;
class GFG
{ // Function that returns true if num is
// greater than both arr[i] and arr[j]
static Boolean isPeak( int []arr, int n, int num,
int i, int j)
{
// If num is smaller than the element
// on the left (if exists)
if (i >= 0 && arr[i] > num)
{
return false ;
}
// If num is smaller than the element
// on the right (if exists)
if (j < n && arr[j] > num)
{
return false ;
}
return true ;
}
// Function that returns true if num is
// smaller than both arr[i] and arr[j]
static Boolean isTrough( int []arr, int n, int num,
int i, int j)
{
// If num is greater than the element
// on the left (if exists)
if (i >= 0 && arr[i] < num)
{
return false ;
}
// If num is greater than the element
// on the right (if exists)
if (j < n && arr[j] < num)
{
return false ;
}
return true ;
}
static void printPeaksTroughs( int []arr, int n)
{
Console.Write( "Peaks : " );
// For every element
for ( int i = 0; i < n; i++)
{
// If the current element is a peak
if (isPeak(arr, n, arr[i], i - 1, i + 1))
{
Console.Write(arr[i] + " " );
}
}
Console.WriteLine( "" );
Console.Write( "Troughs : " );
// For every element
for ( int i = 0; i < n; i++)
{
// If the current element is a trough
if (isTrough(arr, n, arr[i], i - 1, i + 1))
{
Console.Write(arr[i] + " " );
}
}
}
// Driver code
public static void Main(String[] args)
{
int []arr = {5, 10, 5, 7, 4, 3, 5};
int n = arr.Length;
printPeaksTroughs(arr, n);
}
} // This code is contributed by Princi Singh |
<script> // Function that returns true if num is // greater than both arr[i] and arr[j] function isPeak(arr, n, num, i, j)
{ // If num is smaller than the element
// on the left (if exists)
if (i >= 0 && arr[i] > num)
return false ;
// If num is smaller than the element
// on the right (if exists)
if (j < n && arr[j] > num)
return false ;
return true ;
} // Function that returns true if num is // smaller than both arr[i] and arr[j] function isTrough( arr, n, num, i, j)
{ // If num is greater than the element
// on the left (if exists)
if (i >= 0 && arr[i] < num)
return false ;
// If num is greater than the element
// on the right (if exists)
if (j < n && arr[j] < num)
return false ;
return true ;
} function printPeaksTroughs( arr, n)
{ document.write( "Peaks : " );
// For every element
for ( var i = 0; i < n; i++) {
// If the current element is a peak
if (isPeak(arr, n, arr[i], i - 1, i + 1))
document.write( arr[i] + " " );
}
document.write( "<br>" );
document.write( "Troughs : " );
// For every element
for ( var i = 0; i < n; i++) {
// If the current element is a trough
if (isTrough(arr, n, arr[i], i - 1, i + 1))
document.write( arr[i] + " " );
}
} var arr=[ 5, 10, 5, 7, 4, 3, 5 ];
printPeaksTroughs(arr, 7);
</script> |
Peaks : 10 7 5 Troughs : 5 5 3
Time Complexity: O(n), where n is the size of the given array.
Auxiliary Space: O(1), no extra space is required, so it is a constant.