Problem#
Given an array of lowercase letters sorted in ascending order, and a target
letter, find the smallest letter in the array that is greater than the target
.
Note that, Letters also wrap around. For example, if target = 'z'
and letters = ['a', 'b']
, the answer is 'a'
.
Example#
Example 1:
1
2
Input: letters = [ "d" , "h" , "l" ], target = "a"
Output: "d"
Example 2:
1
2
Input: letters = [ "d" , "h" , "l" ], target = "d"
Output: "h"
Example 3:
1
2
Input: letters = [ "d" , "h" , "l" ], target = "f"
Output: "h"
Example 4:
1
2
Input: letters = [ "d" , "h" , "l" ], target = "j"
Output: "l"
Example 4:
1
2
Input: letters = [ "d" , "h" , "l" ], target = "n"
Output: "d"
Solution#
This problem is similar to - Find ceiling of target element in a sorted array
Method 1 - Binary Search#
These solutions leverage binary search to efficiently find the smallest letter greater than the target, taking advantage of the sorted nature of the input array.
Code#
Java
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Solution {
public char nextGreatestLetter (char [] letters, char target) {
int low = 0, high = letters.length - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (letters[ mid] <= target) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return letters[ low % letters.length ] ;
}
// Example usage
public static void main (String[] args) {
Solution sol = new Solution();
char [] letters = {'c' , 'f' , 'j' };
char target = 'a' ;
System.out .println (
sol.nextGreatestLetter (letters, target)); // Output: c
}
}
1
2
3
4
5
6
7
8
9
10
11
def nextGreatestLetter (letters, target):
low, high = 0 , len(letters) - 1
while low <= high:
mid = (low + high) // 2
if letters[mid] <= target:
low = mid + 1
else :
high = mid - 1
return letters[low % len(letters)]
Complexity#
⏰ Time complexity: O(log n)
, due to binary search.
🧺 Space complexity: O(1)
, as no extra space is used apart from a few variables.