# 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:tExplanation:

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

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 characteror not.**K** - 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. Set**ch****start**to**mid + 1**to search for a smaller character nearer to**K**. - Otherwise, set
**end**to**mid-1**. - Keep 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 <bits/stdc++.h>` `using` `namespace` `std;` `// Function to return the` `// nearest smaller character` `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[0]);` ` ` `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 character` `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 character` `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 character` `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. To complete your preparation from learning a language to DS Algo and many more, please refer **Complete Interview Preparation Course****.**

In case you wish to attend **live classes **with experts, please refer **DSA Live Classes for Working Professionals **and **Competitive Programming Live for Students**.