题目:
个人总结
给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。
在比较时,字母是依序循环出现的。举个例子:
如果目标字母 target = 'z' 并且字符列表为 letters = ['a', 'b'],则答案返回 'a'
这道题十分简单,无法就是遍历而已,同时需要注意的是初始值,因为可能存所有值都比目标值都大,因此需要先判断最后一个值。
同时由于过多的使用线性查找,时间开销为O(n),这道题是可以使用二分查找的,因为是一个有序表,因此二分查找效率会更加高。
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
int len = letters.length - 1;
if(target >= letters[len]){ //这里需要注意是等于
return letters[0];
}
int pre = 0;
while(pre < len){
int mid = (len - pre) / 2 + pre;
if(target < letters[mid]){
len = mid;
}else{
pre = mid + 1; // 这里容易忘记加1
}
}
return letters[pre];
}
}