给你一个字符数组 letters
,该数组按非递减顺序排序,以及一个字符 target
。letters
里至少有两个不同的字符。
返回 letters
中大于 target
的最小的字符。如果不存在这样的字符,则返回 letters
的第一个字符。
示例 1:
输入: letters = ["c", "f", "j"],target = "a" 输出: "c" 解释:letters 中字典上比 'a' 大的最小字符是 'c'。
示例 2:
输入: letters = ["c","f","j"], target = "c" 输出: "f" 解释:letters 中字典顺序上大于 'c' 的最小字符是 'f'。
示例 3:
输入: letters = ["x","x","y","y"], target = "z" 输出: "x" 解释:letters 中没有一个字符在字典上大于 'z',所以我们返回 letters[0]。
左闭右开:
最后可以返回left或者right,因为循环退出的条件是left==right
//左闭右开
class Solution {
public:
char nextGreatestLetter(vector<char>& letters, char target) {
int left = 0, right = letters.size();
while(left < right){
int mid = left + (right - left) / 2;
if(letters[mid] > target)
right = mid;
else
left = mid + 1;
}
if (left == letters.size())
return letters[0];
return letters[left];
}
};
左闭右闭:
最后可以返回只能left,因为循环退出的条件是left > right,例如示例一中right最后等于-1,如果返回right则数组越界
class Solution {
public:
char nextGreatestLetter(vector<char>& letters, char target) {
int left = 0, right = letters.size() - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(letters[mid] > target)
right = mid - 1 ;
else
left = mid + 1;
}
if (left == letters.size())
return letters[0];
return letters[left];
}
};