题目:
给你一个排序后的字符列表 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 是一个小写字母
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-smallest-letter-greater-than-target
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
【二分查找】
设定左右指针并初始化,left = 0, right = letters.length - 1,根据题目中【如果目标字母 target = 'z' 并且字符列表为 letters = ['a', 'b'],则答案返回 'a'】,可以知道特殊情况,如果target大于等于letters中任何字母,则直接返回letters中的第一个字母。然后判断一般情况,逐渐缩小搜索范围,循环条件是while(left < right):
- 算出mid = left + (right - left) / 2;
- 如果letters[mid] > target:有可能这时的答案就是mid,如果不是也只是在mid的左边,即right = left;
- 如果letters[mid] <= target:这时答案只可能存在在mid的右边,即left = mid + 1;
- 循环结束的条件是:left == right,搜索区间缩为一个点,返回 letters[left] 或者 letters[right]均可。
1 class Solution { 2 public char nextGreatestLetter(char[] letters, char target) { 3 int left = 0, right = letters.length - 1; 4 if (target >= letters[letters.length - 1]) return letters[0]; 5 while (left < right){ 6 int mid = left + (right - left) / 2; 7 if (letters[mid] > target){ 8 //答案可能在右边:[left, mid] 9 right = mid; 10 }else { 11 //[mid + 1, right] 12 left = mid + 1; 13 } 14 } 15 return letters[left]; 16 } 17 }
python3代码:
1 class Solution: 2 def nextGreatestLetter(self, letters: List[str], target: str) -> str: 3 left, right = 0, len(letters) - 1 4 if target >= letters[len(letters) - 1]: 5 return letters[0] 6 while left <= right: 7 mid = left + (right - left) // 2 8 if letters[mid] > target: 9 right = mid - 1 10 else: 11 left = mid + 1 12 # left > right:left的位置为大于target的最小字母下标 13 return letters[left]标签:right,letters,target,python,字母,mid,java,left From: https://www.cnblogs.com/liu-myu/p/16907551.html