1、题目描述
2、解题思路
由于字符列表有序,且找出比目标字母大的最小字母,很明显采用二分查找。
区间呈左开右闭形式。
当中间字符小于等于目标字符,则更新左边界为 mid + 1;
当中间字符大于目标字符时,可能它就是比目标字母大的最小字母,更新右边界为 mid;
当结束 while 循环时,left == right,此时 left 就是比目标字母大的最小字母的索引,因为字母是循环出现的,需要和字符列表取模。
3、解题代码
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
int left = 0, right = letters.length;
while (left < right) {
int mid = left + (right - left) / 2;
if (letters[mid] <= target) {
left = mid + 1;
} else {
right = mid;
}
}
return letters[left % letters.length];
}
}