# Nearest smaller character to a character K from a Sorted Array

Given a sorted array of characters arr[] and a character K, the task is to find the character with nearest smaller ASCII value than K from the given array. Print -1 if no character is found to be having smaller ASCII value than K.
Examples:

Input: arr[] = {‘e’, ‘g’, ‘t’, ‘y’}, K = ‘u’
Output:
Explanation:
The character with nearest smaller ASCII value as of ‘u’ is ‘t’.

Input: arr[] = {‘e’, ‘g’, ‘t’, ‘y’}, K = ‘a’
Output: -1
Explanation:
No character exists with ASCII value smaller than that of ‘a’.

Naive Approach:
The simplest approach to solve the problem is to iterate over the array and find the character having smaller ASCII value than that of K and the difference between their ASCII values is minimum.
Time Complexity: O(N)
Auxiliary Space: O(1)

Efficient Approach:
The idea is to use Binary Search to find out the floor element (largest character just smaller than key). Follow the steps below to solve the problem:

• Perform binary search on the array.
• Check if the current middle element(mid) is equal to the character K or not.
• If so, then set start to mid – 1, because we need to find just smaller element.
• If the arr[mid] is smaller than K, then store it in some variable say ch. Set start to mid + 1 to search for a smaller character nearer to K.
• Otherwise, set end to mid-1.
• Kepp repeating the above steps. Finally, print the character obtained after completing the search. If no character is obtained, print -1.

Below is the implementation of the above approach:

## C++

 `// C++ Program to implement ` `// the above approach ` `#include ` `using` `namespace` `std; ` ` `  `// Function to return the ` `// nearest smaller charcter ` `char` `bs(``char` `ar[], ``int` `n, ``int` `ele) ` `{ ` `    ``int` `start = 0; ` `    ``int` `end = n - 1; ` ` `  `    ``// Stores the nearest smaller ` `    ``// character ` `    ``char` `ch = ``'@'``; ` ` `  `    ``// Iterate till starts cross end ` `    ``while` `(start <= end) { ` ` `  `        ``// Find the mid element ` `        ``int` `mid = start + (end - start) / 2; ` ` `  `        ``// Check if K is found ` `        ``if` `(ar[mid] == ele) ` `            ``end = mid - 1; ` ` `  `        ``// Check if current character ` `        ``// is less than K ` `        ``else` `if` `(ar[mid] < ele) { ` `            ``ch = ar[mid]; ` ` `  `            ``// Increment the start ` `            ``start = mid + 1; ` `        ``} ` ` `  `        ``// Otherwise ` `        ``else` ` `  `            ``// Increment end ` `            ``end = mid - 1; ` `    ``} ` `    ``// Return the character ` `    ``return` `ch; ` `} ` ` `  `// Driver Code ` `int` `main() ` `{ ` `    ``char` `ar[] = { ``'e'``, ``'g'``, ``'t'``, ``'y'` `}; ` `    ``int` `n = ``sizeof``(ar) / ``sizeof``(ar); ` ` `  `    ``char` `K = ``'u'``; ` ` `  `    ``char` `ch = bs(ar, n, K); ` ` `  `    ``if` `(ch == ``'@'``) ` `        ``cout << ``"-1"``; ` `    ``else` `        ``cout << ch; ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java program to implement ` `// the above approach ` `import` `java.util.*; ` ` `  `class` `GFG{ ` ` `  `// Function to return the ` `// nearest smaller charcter ` `static` `char` `bs(``char` `ar[], ``int` `n, ``int` `ele) ` `{ ` `    ``int` `start = ``0``; ` `    ``int` `end = n - ``1``; ` ` `  `    ``// Stores the nearest smaller ` `    ``// character ` `    ``char` `ch = ``'@'``; ` ` `  `    ``// Iterate till starts cross end ` `    ``while` `(start <= end)  ` `    ``{ ` ` `  `        ``// Find the mid element ` `        ``int` `mid = start + (end - start) / ``2``; ` ` `  `        ``// Check if K is found ` `        ``if` `(ar[mid] == ele) ` `            ``end = mid - ``1``; ` ` `  `        ``// Check if current character ` `        ``// is less than K ` `        ``else` `if` `(ar[mid] < ele)  ` `        ``{ ` `            ``ch = ar[mid]; ` ` `  `            ``// Increment the start ` `            ``start = mid + ``1``; ` `        ``} ` ` `  `        ``// Otherwise ` `        ``else` ` `  `            ``// Increment end ` `            ``end = mid - ``1``; ` `    ``} ` `     `  `    ``// Return the character ` `    ``return` `ch; ` `} ` ` `  `// Driver Code ` `public` `static` `void` `main(String[] args) ` `{ ` `    ``char` `ar[] = { ``'e'``, ``'g'``, ``'t'``, ``'y'` `}; ` `    ``int` `n = ar.length; ` ` `  `    ``char` `K = ``'u'``; ` ` `  `    ``char` `ch = bs(ar, n, K); ` ` `  `    ``if` `(ch == ``'@'``) ` `        ``System.out.print(``"-1"``); ` `    ``else` `        ``System.out.print(ch); ` `} ` `} ` ` `  `// This code is contributed by 29AjayKumar `

## Python3

 `# Python3 program to implement ` `# the above approach ` ` `  `# Function to return the ` `# nearest smaller charcter ` `def` `bs(a, n, ele): ` `     `  `    ``start ``=` `0` `    ``end ``=` `n ``-` `1` `     `  `    ``# Stores the nearest smaller ` `    ``# character ` `    ``ch ``=` `'@'` `     `  `    ``# Iterate till starts cross end ` `    ``while` `(start <``=` `end): ` `         `  `        ``# Find the mid element ` `        ``mid ``=` `start ``+` `(end ``-` `start) ``/``/` `2``; ` ` `  `        ``# Check if K is found ` `        ``if``(ar[mid] ``=``=` `ele): ` `            ``end ``=` `mid ``-` `1` `             `  `        ``# Check if current character ` `        ``# is less than K ` `        ``elif``(ar[mid] < ele): ` `            ``ch ``=` `ar[mid] ` `             `  `            ``# Increment the start ` `            ``start ``=` `mid ``+` `1``; ` `         `  `        ``# Otherwise ` `        ``else``: ` `             `  `            ``# Increment end ` `            ``end ``=` `mid ``-` `1``; ` `             `  `    ``# Return the character ` `    ``return` `ch ` ` `  `# Driver code ` `if` `__name__``=``=``'__main__'``: ` `     `  `    ``ar ``=` `[ ``'e'``, ``'g'``, ``'t'``, ``'y'` `] ` `    ``n ``=` `len``(ar) ` `    ``K ``=` `'u'``; ` ` `  `    ``ch ``=` `bs(ar, n, K); ` ` `  `    ``if` `(ch ``=``=` `'@'``): ` `        ``print``(``'-1'``) ` `    ``else``: ` `        ``print``(ch) ` `         `  `# This code is contributed by rutvik_56 `

## C#

 `// C# program to implement ` `// the above approach ` `using` `System; ` ` `  `class` `GFG{ ` ` `  `// Function to return the ` `// nearest smaller charcter ` `static` `char` `bs(``char` `[]ar, ``int` `n, ``int` `ele) ` `{ ` `    ``int` `start = 0; ` `    ``int` `end = n - 1; ` ` `  `    ``// Stores the nearest smaller ` `    ``// character ` `    ``char` `ch = ``'@'``; ` ` `  `    ``// Iterate till starts cross end ` `    ``while` `(start <= end)  ` `    ``{ ` ` `  `        ``// Find the mid element ` `        ``int` `mid = start + (end - start) / 2; ` ` `  `        ``// Check if K is found ` `        ``if` `(ar[mid] == ele) ` `            ``end = mid - 1; ` ` `  `        ``// Check if current character ` `        ``// is less than K ` `        ``else` `if` `(ar[mid] < ele)  ` `        ``{ ` `            ``ch = ar[mid]; ` ` `  `            ``// Increment the start ` `            ``start = mid + 1; ` `        ``} ` ` `  `        ``// Otherwise ` `        ``else` ` `  `            ``// Increment end ` `            ``end = mid - 1; ` `    ``} ` `     `  `    ``// Return the character ` `    ``return` `ch; ` `} ` ` `  `// Driver Code ` `public` `static` `void` `Main(String[] args) ` `{ ` `    ``char` `[]ar = { ``'e'``, ``'g'``, ``'t'``, ``'y'` `}; ` `    ``int` `n = ar.Length; ` ` `  `    ``char` `K = ``'u'``; ` `    ``char` `ch = bs(ar, n, K); ` ` `  `    ``if` `(ch == ``'@'``) ` `        ``Console.Write(``"-1"``); ` `    ``else` `        ``Console.Write(ch); ` `} ` `} ` ` `  `// This code is contributed by 29AjayKumar`

Output:

```t
```

Time Complexity: O(logN)
Auxiliary Space: O(1)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.