随笔 - 384  文章 - 0  评论 - 0  阅读 - 13万

力扣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   我不想一直当菜鸟  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示