莫名其妙的,LeetCode网站怎么也打不开了。。只好注册了中国版的,中国版里的讨论区好冷清,题解质量也堪忧。
给定一个只包含小写字母的有序数组letters
和一个目标字母 target
,寻找有序数组里面比目标字母大的最小字母。
数组里字母的顺序是循环的。举个例子,如果目标字母target = 'z'
并且有序数组为 letters = ['a', 'b']
,则答案返回 'a'
。
示例:
输入:
letters = ["c", "f", "j"]
target = "a"
输出: "c"
输入:
letters = ["c", "f", "j"]
target = "c"
输出: "f"
输入:
letters = ["c", "f", "j"]
target = "d"
输出: "f"
输入:
letters = ["c", "f", "j"]
target = "g"
输出: "j"
输入:
letters = ["c", "f", "j"]
target = "j"
输出: "c"
输入:
letters = ["c", "f", "j"]
target = "k"
输出: "c"
-----------------------------------------------------------------------------------------------------------------------------------
如果target在数组里的话,找到target最后一次出现的位置,然后向后一步即可
如果target不在数组里的话,最终low的位置就是要返回的元素的位置
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
int low = 0;
int high = letters.length-1;
int idx = -1;
while(low<=high){
int mid = (low+high)/2;
if(target==letters[mid]){
idx = mid;
low = mid+1;
}
else if(target>letters[mid]){
low = mid+1;
}
else if(target<letters[mid]){
high = mid-1;
}
}
if(idx==-1){
return low<letters.length?letters[low]:letters[0];
}
else{
return idx+1<letters.length?letters[idx+1]:letters[0];
}
}
}