Find an element in an array such that elements form a strictly decreasing and increasing sequence
Given an array of positive integers, the task is to find a point/element up to which elements form a strictly decreasing sequence first followed by a sequence of strictly increasing integers.
- Both of the sequences must at least be of length 2 (considering the common element).
- The last value of the decreasing sequence is the first value of the increasing sequence.
Note: Print “No such element exist”, if not found.
Examples:
Input: arr[] = {3, 2, 1, 2} Output: 1 {3, 2, 1} is strictly decreasing then {1, 2} is strictly increasing. Input: arr[] = {3, 2, 1} Output: No such element exist
Approach:
- First start traversing the array and keep traversing till the elements are in strictly decreasing order.
- If next elements is greater than the previous element store that element in point variable.
- Start traversing the elements from that point and keep traversing till the elements are in the strictly increasing order.
- After step 3, if all the elements get traversed then print that point.
- Else print “No such element exist.”
Note: If any of the two elements are equal then also print “No such element exist” as it should be strictly decreasing and increasing.
Below is the implementation of above approach:
C++
// C++ implementation of above approach #include <bits/stdc++.h> using namespace std; // Function to check such sequence int findElement( int a[], int n) { // set increasing/decreasing sequence counter to 1 int inc = 1, dec = 1, point; // for loop counter from 1 to last index of list for ( int i = 1; i < n; i++) { // check if current int is // smaller than previous int if (a[i] < a[i - 1]) { // if inc is 1, i.e., increasing // seq. never started if (inc == 1) // increase dec by 1 dec++; else return -1; } // check if current int is greater than previous int else if (a[i] > a[i - 1]) { // if inc is 1, i.e., increasing seq. // starting for first time, if (inc == 1) // store a[i-1] in point point = a[i - 1]; // only if decreasing seq. minimum // count has been met, if (dec >= 2) // increase inc by 1 inc++; else // return -1 as decreasing seq. // min. count must be 2 return -1; } // check if current int is equal // to previous int, if so, else if (a[i] == a[i - 1]) return -1; } // check if inc >= 2 and dec >= 2 // return point if (inc >= 2 && dec >= 2) return point; // otherwise return -1 else return -1; } // Driver code int main() { int arr[] = { 3, 2, 1, 2 }; int n = sizeof (arr) / sizeof (arr[0]); int ele = findElement(arr, n); if (ele == -1) cout << "No such element exist" ; else cout << ele; return 0; } |
Java
// Java implementation of above approach public class GFG { // Function to check such sequence static int findElement( int a[], int n) { // set increasing/decreasing sequence counter to 1 int inc = 1 , dec = 1 , point = 0 ; // for loop counter from 1 to last index of list for ( int i = 1 ; i < n; i++) { // check if current int is // smaller than previous int if (a[i] < a[i - 1 ]) { // if inc is 1, i.e., increasing // seq. never started if (inc == 1 ) // increase dec by 1 dec++; else return - 1 ; } // check if current int is greater than previous int else if (a[i] > a[i - 1 ]) { // if inc is 1, i.e., increasing seq. // starting for first time, if (inc == 1 ) // store a[i-1] in point point = a[i - 1 ]; // only if decreasing seq. minimum // count has been met, if (dec >= 2 ) // increase inc by 1 inc++; else // return -1 as decreasing seq. // min. count must be 2 return - 1 ; } // check if current int is equal // to previous int, if so, else if (a[i] == a[i - 1 ]) return - 1 ; } // check if inc >= 2 and dec >= 2 // return point if (inc >= 2 && dec >= 2 ) return point; // otherwise return -1 else return - 1 ; } // Driver code public static void main(String args[]) { int arr[] = { 3 , 2 , 1 , 2 }; int n = arr.length ; int ele = findElement(arr, n); if (ele == - 1 ) System.out.println( "No such element exist" ); else System.out.println(ele); } // This Code is contributed by ANKITRAI1 } |
Python
# Python implementation of above approach def findElement(a, n): # set increasing sequence counter to 1 inc = 1 # set decreasing sequence counter to 1 dec = 1 # for loop counter from 1 to last # index of list [len(array)-1] for i in range ( 1 , n): # check if current int is smaller than previous int if (a[i] < a[i - 1 ]): # if inc is 1, i.e., increasing seq. never started, if inc = = 1 : # increase dec by 1 dec = dec + 1 else : # return -1 since if increasing seq. has started, # there cannot be a decreasing seq. in a valley return - 1 # check if current int is greater than previous int elif (a[i] > a[i - 1 ]): # if inc is 1, i.e., increasing seq. # starting for first time, if inc = = 1 : # store a[i-1] in point point = a[i - 1 ] # only if decreasing seq. minimum count has been met, if dec > = 2 : # increase inc by 1 inc = inc + 1 else : # return -1 as decreasing seq. min. count must be 2 return - 1 # check if current int is equal to previous int, if so, elif (a[i] = = a[i - 1 ]): # return false as valley is always # strictly increasing / decreasing return - 1 # check if inc >= 2 and dec >= 2, if (inc > = 2 and dec > = 2 ): # return point return point else : # otherwise return -1 return - 1 a = [ 2 , 1 , 2 ] n = len (a) ele = findElement(a, n) if ( ele = = - 1 ): print ( "No such element exist" ) else : print (ele) |
C#
// C# implementation of above approach using System; class GFG { // Function to check such sequence static int findElement( int []a, int n) { // set increasing/decreasing // sequence counter to 1 int inc = 1, dec = 1, point = 0; // for loop counter from 1 to // last index of list for ( int i = 1; i < n; i++) { // check if current int is // smaller than previous int if (a[i] < a[i - 1]) { // if inc is 1, i.e., increasing // seq. never started if (inc == 1) // increase dec by 1 dec++; else return -1; } // check if current int is greater // than previous int else if (a[i] > a[i - 1]) { // if inc is 1, i.e., increasing // seq. starting for first time, if (inc == 1) // store a[i-1] in point point = a[i - 1]; // only if decreasing seq. // minimum count has been met, if (dec >= 2) // increase inc by 1 inc++; else // return -1 as decreasing // seq. min. count must be 2 return -1; } // check if current int is equal // to previous int, if so, else if (a[i] == a[i - 1]) return -1; } // check if inc >= 2 and // dec >= 2, return point if (inc >= 2 && dec >= 2) return point; // otherwise return -1 else return -1; } // Driver code public static void Main() { int []arr = { 3, 2, 1, 2 }; int n = arr.Length ; int ele = findElement(arr, n); if (ele == -1) Console.WriteLine( "No such element exist" ); else Console.WriteLine(ele); } } // This code is contributed by Shashank |
PHP
<?php // PHP implementation of above approach // Function to check such sequence function findElement(& $a , $n ) { // set increasing/decreasing // sequence counter to 1 $inc = 1; $dec = 1; // for loop counter from 1 // to last index of list for ( $i = 1; $i < $n ; $i ++) { // check if current int is // smaller than previous int if ( $a [ $i ] < $a [ $i - 1]) { // if inc is 1, i.e., increasing // seq. never started if ( $inc == 1) // increase dec by 1 $dec ++; else return -1; } // check if current int is greater // than previous int else if ( $a [ $i ] > $a [ $i - 1]) { // if inc is 1, i.e., increasing // seq. starting for first time, if ( $inc == 1) // store a[i-1] in point $point = $a [ $i - 1]; // only if decreasing seq. // minimum count has been met, if ( $dec >= 2) // increase inc by 1 $inc ++; else // return -1 as decreasing // seq. min. count must be 2 return -1; } // check if current int is equal // to previous int, if so, else if ( $a [ $i ] == $a [ $i - 1]) return -1; } // check if inc >= 2 and // dec >= 2, return point if ( $inc >= 2 && $dec >= 2) return $point ; // otherwise return -1 else return -1; } // Driver code $arr = array (3, 2, 1, 2); $n = sizeof( $arr ); $ele = findElement( $arr , $n ); if ( $ele == -1) echo "No such element exist" ; else echo $ele ; // This code is contributed // by ChitraNayal ?> |
Javascript
<script> // Java Script implementation of above approach // Function to check such sequence function findElement(a,n) { // set increasing/decreasing sequence counter to 1 let inc = 1, dec = 1, point = 0; // for loop counter from 1 to last index of list for (let i = 1; i < n; i++) { // check if current int is // smaller than previous int if (a[i] < a[i - 1]) { // if inc is 1, i.e., increasing // seq. never started if (inc == 1) // increase dec by 1 dec++; else return -1; } // check if current int is greater than previous int else if (a[i] > a[i - 1]) { // if inc is 1, i.e., increasing seq. // starting for first time, if (inc == 1) // store a[i-1] in point point = a[i - 1]; // only if decreasing seq. minimum // count has been met, if (dec >= 2) // increase inc by 1 inc++; else // return -1 as decreasing seq. // min. count must be 2 return -1; } // check if current int is equal // to previous int, if so, else if (a[i] == a[i - 1]) return -1; } // check if inc >= 2 and dec >= 2 // return point if (inc >= 2 && dec >= 2) return point; // otherwise return -1 else return -1; } // Driver code let arr = [3, 2, 1, 2 ]; let n = arr.length ; let ele = findElement(arr, n); if (ele == -1) document.write( "No such element exist" ); else document.write(ele); // This code is contributed by sravan kumar Gottumukkala </script> |
Output
1
Complexity Analysis:
- Time Complexity: O(n)
- Auxiliary Space: O(1)
Please Login to comment...