题目:

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

力扣744(java&python)- 寻找比目标字母大的最小字母(简单)的更多相关文章

  1. Java实现 LeetCode 744 寻找比目标字母大的最小字母(二分法)

    744. 寻找比目标字母大的最小字母 给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母. 在比较时,数组里字母的是循环有序的.举个例 ...

  2. C#版(击败100.00%的提交) - Leetcode 744. 寻找比目标字母大的最小字母 - 题解

    C#版 - Leetcode 744. 寻找比目标字母大的最小字母 - 题解 744.Find Smallest Letter Greater Than Target 在线提交: https://le ...

  3. Leetcode之二分法专题-744. 寻找比目标字母大的最小字母(Find Smallest Letter Greater Than Target)

    Leetcode之二分法专题-744. 寻找比目标字母大的最小字母(Find Smallest Letter Greater Than Target) 给定一个只包含小写字母的有序数组letters  ...

  4. [Swift]LeetCode744. 寻找比目标字母大的最小字母 | Find Smallest Letter Greater Than Target

    Given a list of sorted characters letterscontaining only lowercase letters, and given a target lette ...

  5. Leetcode744.Find Smallest Letter Greater Than Target寻找比目标字母大的最小字母

    给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母. 数组里字母的顺序是循环的.举个例子,如果目标字母target = 'z' 并且有 ...

  6. C#LeetCode刷题之#744-寻找比目标字母大的最小字母(Find Smallest Letter Greater Than Target)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4001 访问. 给定一个只包含小写字母的有序数组letters 和 ...

  7. 744. 寻找比目标字母大的最小字母--LeetCode

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/find-smallest-letter-greater-than-target 著作权归领扣网络所有. ...

  8. LeetCode 744. Find Smallest Letter Greater Than Target (寻找比目标字母大的最小字母)

    题目标签:Binary Search 题目给了我们一组字母,让我们找出比 target 大的最小的那个字母. 利用 binary search,如果mid 比 target 小,或者等于,那么移到右半 ...

  9. 744. Find Smallest Letter Greater Than Target 查找比目标字母大的最小字母

    [抄题]: Given a list of sorted characters letters containing only lowercase letters, and given a targe ...

  10. 力扣(LeetCode)寻找数组的中心索引 个人题解

    给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和. 如果数组不存在中心索引,那么我 ...

随机推荐

  1. 对象遍历 Object.keys(obj).forEach(name=> {})

    Object.keys(props).forEach(name => { watch[name] = function (value) { this.columnConfig.update(na ...

  2. manjaro系统的xfce桌面环境的的壁纸存放位置

    /usr/share/backgrounds/xfce 添加新照片的命令是: sudo mv 目录/* /usr/share/backgrounds/xfce  

  3. Windows逆向之配置虚拟机环境

    安装虚拟机环境 首先下载吾爱破解论坛专用版虚拟机软件VMWare Workstation 12,注册成功:再通过虚拟机启动论坛提供的WinXP系统镜像,在我的win11上完美运行. 实现文件互传 为了 ...

  4. Atom 编辑器实时预览 HTML 页面经典方法

    为什么需要这样一个工具?   每次预览 HTML 页面,都需要打开各种浏览器:哪怕不是调试,只是为了查看下效果:切换来切换去,各种刷新,感觉有些浪费时间:以前用过 DW 的实时预览,感觉这个功能很赞: ...

  5. C++ 中的关联,聚合,组合 以及 它们的生命周期。

    关联,C++使用指针实现,两者到关系最弱,并且可以两向关联,B* A::b 与 A* B::a 可以并存,两者间没有明确的ownership关系,为什么不是引用,因为引用没有办法实现相向引用,这会是一 ...

  6. C++ allocator类

    new在申请内存时,他将内存分配和对象的构造放在了一起,delete也将对象的析构和内存的释放结合在一起.但allocator类允许将内存分配和对象构造分开. 分配内存 allocator<st ...

  7. Cloud XR面临的问题以及Cloud XR主要应用场景

    cloud xr面临的问题 带宽要求高:cloud xr需要实时把一个高码率的视频流,从云端传输到终端,这需要一个非常大的带宽. 延迟要求低:在传输的过程中,它需要一个非常低的时延,XR每进行一个新动 ...

  8. 对象池Pools优化

    目录介绍 01.什么是对象池 02.glide哪里用到对象池 03.多条件key缓存bitmap 3.1 多条件key创建 3.2 key值的复用 04.glide对象池总结 05.学以致用对象池 5 ...

  9. 记录--7个Js async/await高级用法

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 7个Js async/await高级用法 JavaScript的异步编程已经从回调(Callback)演进到Promise,再到如今广泛使 ...

  10. Clang Preprocessor 类的创建

    参考: Create a working compiler with the LLVM framework, Part 2 How to parse C programs with Clang: A ...