题目描述如下:
给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。
在比较时,字母是依序循环出现的。举个例子:
如果目标字母 target = ‘z’ 并且字符列表为 letters = [‘a’, ‘b’],则答案返回 ‘a’
献上代码:
class Solution {
public:
char nextGreatestLetter(vector<char>& letters, char target) {
int r = letters.size();
int l = 0;
if(letters[r-1] <= target)
return letters[0];
while(l < r)
{
int m = (r+l) / 2;
if(letters[m] == target)
{
while(letters[m] == target)
{
if(m > letters.size())
return letters[m-1];
m++;
}
return letters[m];
}
else if(letters[m] > target)
r = m;
else
l = m+1;
}
return letters[l];
}
};
本题思路就是采用二分查找法,使用二分查找时会出现三种情况:等于,大于,小于;
对于后两种情况缩小边界值继续查找即可,对于等于的情况,处理如下:
由于字符列表是升序的,所以对当前坐标递增,直到发现一个大于target的字符为止,递增途中小心越界,越界了就返回当前字符即可。