力扣744(java&python)- 寻找比目标字母大的最小字母(简单)

题目:

给你一个排序后的字符列表 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]

posted on 2022-11-20 09:39  我不想一直当菜鸟  阅读(35)  评论(0编辑  收藏  举报