Given an array arr[], the task is to check that if there exist a triplet (i, j, k) such that arr[i]<arr[k]<arr[j] and i<j<k then print Yes else print No.
Examples:
Input: arr[] = {1, 2, 3, 4, 5}
Output: No
Explanation:
There is no such sub-sequence such that arr[i] < arr[k] < arr[j]Input: arr[] = {3, 1, 5, 0, 4}
Output: Yes
Explanation:
There exist a triplet (3, 5, 4) which is arr[i] < arr[k] < arr[j]
Naive Approach: The idea is to generate all possible triplets and if any triplets satisfy the given conditions the print Yes else print No.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
// Function to check if there exist // triplet in the array such that // i < j < k and arr[i] < arr[k] < arr[j] bool findTriplet(vector< int > nums)
{ for ( int i = 0; i < nums.size(); i++) {
for ( int j = i + 1; j < nums.size(); j++) {
for ( int k = j + 1; k < nums.size(); k++) {
// Triplet found, hence return false
if (nums[i] < nums[k] && nums[k] < nums[j])
return true ;
}
}
}
// No triplet found, hence return false
return false ;
} // Driver Code int main()
{ // Given array
vector< int > arr = { 4, 7, 5, 6 };
// Function Call
if (findTriplet(arr)) {
cout << " Yes" << '\n' ;
}
else {
cout << " No" << '\n' ;
}
return 0;
} |
# Python3 program for the above approach # Function to check if there exist # triplet in the array such that # i < j < k and arr[i] < arr[k] < arr[j] def findTriplet(nums):
for i in range ( len (nums)):
for j in range (i + 1 , len (nums)):
for k in range (j + 1 , len (nums)):
# Triplet found, hence return false
if (nums[i] < nums[k] and nums[k] < nums[j]):
return True
# No triplet found, hence return false
return False
# Driver Code # Given array arr = [ 4 , 7 , 5 , 6 ]
# Function Call if (findTriplet(arr)):
print ( " Yes" )
else :
print ( " No" )
# This code is contributed by shinjanpatra
|
<script> // JavaScript program for the above approach // Function to check if there exist // triplet in the array such that // i < j < k and arr[i] < arr[k] < arr[j] function findTriplet(nums)
{ for (let i = 0; i < nums.length; i++)
{
for (let j = i + 1; j < nums.length; j++)
{
for (let k = j + 1; k < nums.length; k++)
{
// Triplet found, hence return false
if (nums[i] < nums[k] && nums[k] < nums[j])
return true ;
}
}
}
// No triplet found, hence return false
return false ;
} // Driver Code // Given array let arr = [ 4, 7, 5, 6 ]; // Function Call if (findTriplet(arr)) {
document.write( " Yes" , "</br>" )
} else {
document.write( " No" , "</br>" )
} // This code is contributed by shinjanpatra </script> |
// C# program for the above approach using System;
public class HelloWorld
{ // Function to check if there exist
// triplet in the array such that
// i < j < k and arr[i] < arr[k] < arr[j]
public static bool findTriplet( int [] nums)
{
for ( int i = 0; i < nums.Length; i++) {
for ( int j = i + 1; j < nums.Length; j++) {
for ( int k = j + 1; k < nums.Length; k++) {
// Triplet found, hence return false
if (nums[i] < nums[k] && nums[k] < nums[j])
return true ;
}
}
}
// No triplet found, hence return false
return false ;
}
public static void Main( string [] args)
{
// Given array
int []arr = { 4, 7, 5, 6 };
// Function Call
if (findTriplet(arr)) {
Console.WriteLine( "Yes" );
}
else {
Console.WriteLine( "No" );
}
}
} // This code is contributed by CodeWithMini |
// Java program for the above approach import java.util.*;
class GFG{
// Function to check if there exist // triplet in the array such that // i < j < k and arr[i] < arr[k] < arr[j] public static boolean findTriplet( int [] nums)
{ for ( int i = 0 ; i < nums.length; i++) {
for ( int j = i + 1 ; j < nums.length; j++) {
for ( int k = j + 1 ; k < nums.length; k++) {
// Triplet found, hence return false
if (nums[i] < nums[k] && nums[k] < nums[j])
return true ;
}
}
}
// No triplet found, hence return false
return false ;
} // Driver code public static void main(String[] args)
{ // Given array
int arr[] = { 4 , 7 , 5 , 6 };
// Function call
if (findTriplet(arr))
{
System.out.println( "Yes" );
}
else
{
System.out.println( "No" );
}
} } // This code is contributed by CodeWithMini |
Output:
Yes
Time Complexity: O(N3)
Auxiliary Space: O(1)
Efficient Approach: To optimize the above approach the idea is to use the stack to keep the track of the smaller elements in the right of every element in the array arr[]. Below are the steps:
- Traverse the array from the end and maintain a stack which stores the element in the decreasing order.
- To maintain the stack in decreasing order, pop the elements which are smaller than the current element. Then mark the popped element as the third element of the triplet.
- While traversing the array in reverse if any element is less than the last popped element(which is marked as the third element of the triplet). Then their exist a triplet which satisfy the given condition and print Yes.
- Otherwise print No.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
// Function to check if there exist // triplet in the array such that // i < j < k and arr[i] < arr[k] < arr[j] bool findTriplet(vector< int >& arr)
{ int n = arr.size();
stack< int > st;
// Initialize the heights of h1 and h3
// to INT_MAX and INT_MIN respectively
int h3 = INT_MIN, h1 = INT_MAX;
for ( int i = n - 1; i >= 0; i--) {
// Store the current element as h1
h1 = arr[i];
// If the element at top of stack
// is less than the current element
// then pop the stack top
// and keep updating the value of h3
while (!st.empty()
&& st.top() < arr[i]) {
h3 = st.top();
st.pop();
}
// Push the current element
// on the stack
st.push(arr[i]);
// If current element is less
// than h3, then we found such
// triplet and return true
if (h1 < h3) {
return true ;
}
}
// No triplet found, hence return false
return false ;
} // Driver Code int main()
{ // Given array
vector< int > arr = { 4, 7, 5, 6 };
// Function Call
if (findTriplet(arr)) {
cout << " Yes" << '\n' ;
}
else {
cout << " No" << '\n' ;
}
return 0;
} |
// Java program for the above approach import java.util.*;
class GFG{
// Function to check if there exist // triplet in the array such that // i < j < k and arr[i] < arr[k] < arr[j] public static boolean findTriplet( int [] arr)
{ int n = arr.length;
Stack<Integer> st = new Stack<>();
// Initialize the heights of h1 and h3
// to INT_MAX and INT_MIN respectively
int h3 = Integer.MIN_VALUE;
int h1 = Integer.MAX_VALUE;
for ( int i = n - 1 ; i >= 0 ; i--)
{
// Store the current element as h1
h1 = arr[i];
// If the element at top of stack
// is less than the current element
// then pop the stack top
// and keep updating the value of h3
while (!st.empty() && st.peek() < arr[i])
{
h3 = st.peek();
st.pop();
}
// Push the current element
// on the stack
st.push(arr[i]);
// If current element is less
// than h3, then we found such
// triplet and return true
if (h1 < h3)
{
return true ;
}
}
// No triplet found, hence return false
return false ;
} // Driver code public static void main(String[] args)
{ // Given array
int arr[] = { 4 , 7 , 5 , 6 };
// Function call
if (findTriplet(arr))
{
System.out.println( "Yes" );
}
else
{
System.out.println( "No" );
}
} } // This code is contributed by divyeshrabadiya07 |
# Python3 program for the above approach import sys
# Function to check if there exist # triplet in the array such that # i < j < k and arr[i] < arr[k] < arr[j] def findTriplet(arr):
n = len (arr)
st = []
# Initialize the heights of h1 and h3
# to INT_MAX and INT_MIN respectively
h3 = - sys.maxsize - 1
h1 = sys.maxsize
for i in range (n - 1 , - 1 , - 1 ):
# Store the current element as h1
h1 = arr[i]
# If the element at top of stack
# is less than the current element
# then pop the stack top
# and keep updating the value of h3
while ( len (st) > 0 and st[ - 1 ] < arr[i]):
h3 = st[ - 1 ]
del st[ - 1 ]
# Push the current element
# on the stack
st.append(arr[i])
# If current element is less
# than h3, then we found such
# triplet and return true
if (h1 < h3):
return True
# No triplet found, hence
# return false
return False
# Driver Code if __name__ = = '__main__' :
# Given array
arr = [ 4 , 7 , 5 , 6 ]
# Function Call
if (findTriplet(arr)):
print ( "Yes" )
else :
print ( "No" )
# This code is contributed by mohit kumar 29 |
// C# program for the above approach using System;
using System.Collections.Generic;
class GFG{
// Function to check if there exist // triplet in the array such that // i < j < k and arr[i] < arr[k] < arr[j] public static bool findTriplet( int [] arr)
{ int n = arr.Length;
Stack< int > st = new Stack< int >();
// Initialize the heights of h1 and h3
// to INT_MAX and INT_MIN respectively
int h3 = int .MinValue;
int h1 = int .MaxValue;
for ( int i = n - 1; i >= 0; i--)
{
// Store the current element as h1
h1 = arr[i];
// If the element at top of stack
// is less than the current element
// then pop the stack top
// and keep updating the value of h3
while (st.Count != 0 && st.Peek() < arr[i])
{
h3 = st.Peek();
st.Pop();
}
// Push the current element
// on the stack
st.Push(arr[i]);
// If current element is less
// than h3, then we found such
// triplet and return true
if (h1 < h3)
{
return true ;
}
}
// No triplet found, hence return false
return false ;
} // Driver code public static void Main(String[] args)
{ // Given array
int []arr = { 4, 7, 5, 6 };
// Function call
if (findTriplet(arr))
{
Console.WriteLine( "Yes" );
}
else
{
Console.WriteLine( "No" );
}
} } // This code is contributed by PrinciRaj1992 |
<script> // JavaScript program for the above approach // Function to check if there exist // triplet in the array such that // i < j < k and arr[i] < arr[k] < arr[j] function findTriplet(arr)
{ var n = arr.length;
var st = [];
// Initialize the heights of h1 and h3
// to INT_MAX and INT_MIN respectively
var h3 = -1000000000, h1 = 1000000000;
for ( var i = n - 1; i >= 0; i--) {
// Store the current element as h1
h1 = arr[i];
// If the element at top of stack
// is less than the current element
// then pop the stack top
// and keep updating the value of h3
while (st.length!=0
&& st[st.length-1] < arr[i]) {
h3 = st[st.length-1];
st.pop();
}
// Push the current element
// on the stack
st.push(arr[i]);
// If current element is less
// than h3, then we found such
// triplet and return true
if (h1 < h3) {
return true ;
}
}
// No triplet found, hence return false
return false ;
} // Driver Code // Given array var arr = [4, 7, 5, 6 ];
// Function Call if (findTriplet(arr)) {
document.write( " Yes" );
} else {
document.write( " No" );
} </script> |
Yes
Time Complexity: O(N)
Auxiliary Space: O(N)