744. 寻找比目标字母大的最小字母
给定一个只包含小写字母的有序数组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"
第一个是我自己写的,第二个是我提交后找的运行时间最短的,我想多了
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
if(letters[letters.length-1]-target<=0||letters[0]-target>0)
return letters[0];
int start=0;
int end=letters.length-1;
int middle=(letters.length-1)/2;
while(start<end)
{
middle=(start+end)/2;
if(letters[middle]<=target&&letters[middle+1]>target||letters[middle]>target&&letters[middle-1]<=target)
break;
if(letters[middle]<=target)
start=middle+1;
if(letters[middle]>target)
end=middle-1;
}
return letters[middle]<=target?letters[middle+1]:letters[middle];
}
}
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
int len = letters.length;
int low = 0;
int high = len - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (letters[mid] <= target)
low = mid + 1;
else
high = mid - 1;
}
return low < len ? letters[low] : letters[0];
}
}