寻找比目标字母大的最小字母
2024年12月24日大约 2 分钟教学文档二分查找
1.寻找比目标字母大的最小字母
给你一个字符数组 letters,该数组按非递减顺序排序,以及一个字符 target。letters 里至少有两个不同的字符。
返回 letters 中大于 target 的最小的字符。如果不存在这样的字符,则返回 letters 的第一个字符。
示例 1
输入:letters = ["c", "f", "j"],target = "a" 输出:"c" 解释:letters 中字典上比 'a' 大的最小字符是 'c'。
示例 2
输入: letters = ["c","f","j"], target = "c" 输出:"f" 解释:letters 中字典顺序上大于 'c' 的最小字符是 'f'。
示例 3
输入:letters = ["x","x","y","y"], target = "z" 输出:"x" 解释: letters 中没有一个字符在字典上大于 'z',所以我们返回 letters[0]。
2. 分析
由于数组是有序的,我们可以使用二分查找来优化搜索过程。二分查找的基本思想是将数组分成两半,然后根据目标值与中间元素的比较结果,决定在左半部分还是右半部分继续搜索。
处理边界条件:在二分查找的过程中,我们需要处理一些边界条件,比如当 target 大于数组中所有字符时,我们应该返回数组的第一个字符。
更新搜索范围:在二分查找中,每次比较后,我们都需要更新搜索范围。如果 target 小于中间元素,我们搜索右半部分;如果 target 大于中间元素,我们搜索左半部分。
找到结果:当我们找到第一个大于 target 的元素时,我们需要检查它是否是数组中的第一个元素。如果不是,我们返回这个元素;如果是,我们需要继续搜索,直到找到下一个大于 target 的元素。
public class BinSearch2 {
public char nextGreatestLetter(char[] letters, char target) {
int j=letters.length-1;
if (letters[j]<=target)return letters[0];
int i=0;
while (i<=j){
int mid=i+(j-i)/2;
if (letters[mid]>target){
j=mid-1;
}else {
i=mid+1;
}
}
return letters[i];
}
public static void main(String[] args) {
BinSearch2 b=new BinSearch2();
System.out.println(b.nextGreatestLetter(new char[]{'c', 'f', 'j'}, 'a'));
}
}