题目
给你一个排序后的字符列表 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”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-smallest-letter-greater-than-target
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1:线性扫描
由于 letters 已经有序,当从左往右扫描找到比目标字母大字母则该字母就是答案。
否则(letters 不为空)答案是 letters[0]
Java实现
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
int n = letters.length;
for (int i = 0; i < n; i++) {
if (letters[i] > target) return letters[i];
}
return letters[0];
}
}
方法2:二分查找
Java实现
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
int n = letters.length;
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (letters[mid] <= target) l = mid;
else r = mid - 1;
}
if (letters[l] <= target) {
if (l == n - 1) return letters[0];
else return letters[l + 1];
} else {
return letters[l];
}
}
}