744. 寻找比目标字母大的最小字母
给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。
在比较时,字母是依序循环出现的。举个例子:
- 如果目标字母 target = ‘z’ 并且字符列表为 letters = [‘a’, ‘b’],则答案返回 ‘a’
示例 1:
输入: letters = [“c”, “f”, “j”],target = “a”
输出: “c”
示例 2:
输入: letters = [“c”,“f”,“j”], target = “c”
输出: “f”
示例 3:
输入: letters = [“c”,“f”,“j”], target = “d”
输出: “f”
提示:
- 2 <= letters.length <= 104
- letters[i] 是一个小写字母
- letters 按非递减顺序排序
- letters 最少包含两个不同的字母
- target 是一个小写字母
解题思路一
定义一个变量存放最小值,默认第一个元素,因为本来就是有序数组,所以第一个符合条件的值存入变量,退出循环,再返回
var nextGreatestLetter = function(letters, target) {
let min = letters[0]
for(let i = 0; i < letters.length; i++)
if (letters[i] > target) {
min = letters[i]
break;
}
return min;
};
解题思路二
其实跟上边一样,只是不管怎么都会会先循环,符合条件返回值,否则返回数组第一个
var nextGreatestLetter = function(letters, target) {
for (let i = 0; i < letters.length; i++) {
if (letters[i] > target) {
return letters[i];
}
}
return letters[0];
}
}
解题思路三
二分查找
1.目标字母大于列表最后一个字母时,直接返回第一个字母
2.目标字母小于列表最后一个字母时,列表中一定存在比目标字母大字母
3.每次都把列表二分,比较当前下标处的字母和目标字母,如果当前下标处的字母大于目标字母,则从当前下标左侧部分继续查找,否则在右侧查找
var nextGreatestLetter = function(letters, target) {
let len = letters.len;
if (letters.length - 1 >= target) {
return letters[0]
}
let low = 0, high = len -1
while(low < high) {
const mid = (low + hight) / 2 + low
if (letters[mid] > target) {
high = mid
} else {
low = mid + 1
}
}
return letters[low]
}