
教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载本篇题解基于 AlgoNote「算法通关手册」仓库中的 0744. 寻找比目标字母大的最小字母题解 展开聚焦「数组 二分查找」双标签的经典查找变体在有序字符数组中寻找比目标字母大的最小字符并正确处理不存在则回绕到数组首元素的边界。读完本文你将掌握左闭右开区间写法下的二分查找模板、left % n回绕技巧以及它在仓库二分查找知识体系二分查找基础、二分查找细节中的定位。一、题目背景与核心考点本题目录编号为 0744位于仓库题解体系的 0700-0799 题解目录 中目录条目同时在 分类题单 中被标注为「数组、二分查找」标签、难度「简单」。它属于二分查找学习路径上的典型简单题但与 0704「二分查找」的直接查找不同本题考察的是二分查找的变体能力在有序数组中寻找严格大于目标值的最小元素并在查找落空时做环形回绕。这两点正是从入门二分走向二分边界问题的关键过渡也是仓库中 二分查找二 所强调的排除法/边界查找思路的典型应用。二、题目理解输入、输出与约束描述给定一个字符数组letters该数组按非递减顺序排序以及一个字符target。letters里至少有两个不同的字符。要求找出letters中大于target的最小字符。如果不存在这样的字符则返回letters的第一个字符。说明约束条件约束取值数组长度$2 \le letters.length \le 10^4$元素类型letters[i]均为小写字母数组有序性letters按非递减顺序排序即允许重复字符字符多样性letters至少包含两个不同的字母目标值target是小写字母示例示例 1输入: letters [c, f, j]target a 输出: c 解释letters 中字典上比 a 大的最小字符是 c。示例 2输入: letters [c,f,j], target c 输出: f 解释letters 中字典顺序上大于 c 的最小字符是 f。需要特别注意的是回绕语义若target比letters中所有字符都大例如letters [c,f,j]、target z此时大于 target 的最小字符不存在应当返回letters[0]即c。这相当于把有序字符数组看作一个环形有序序列来处理。三、解题思路从线性扫描到二分查找3.1 基线方案线性扫描O(n)最朴素的做法是从左到右扫描数组找到第一个letters[i] target的字符并返回若扫描完仍未找到则返回letters[0]class Solution: def nextGreatestLetter(self, letters: List[str], target: str) - str: for ch in letters: if ch target: return ch return letters[0]该方案正确但时间复杂度为 $O(n)$。在 $n$ 最大可达 $10^4$ 的约束下虽然可以通过但利用数组有序这一关键条件完全可以将复杂度降到 $O(\log n)$。3.2 优化方案二分查找由于letters是非递减有序的我们可以利用二分查找在 $O(\log n)$ 时间内定位第一个大于target的位置。这正是仓库 01_13 二分查找基础 中强调的「减而治之」思想每次比较中间元素排除掉一半必然不包含答案的区间。本题与经典二分的区别在于不存在命中即返回我们找的不是等于target的元素而是第一个大于target的元素属于典型的边界查找问题对应仓库 二分查找二 中的「排除法」思路。允许重复由于数组可能包含多个等于target的字符非递减排序第一个大于要求我们把所有 target和 target的元素都排除掉。回绕处理当二分查找结束后left越界等于n说明target大于数组中所有字符需要对n取余从而回到letters[0]。四、思路 1二分查找左闭右开代码实现题解采用左闭右开区间$[left, right)$ 写法将right初始化为len(letters)即最后一个元素的下一个位置。这样当循环结束时left天然指向第一个大于target的位置且该位置取值域恰好落在 $[0, n]$与回绕逻辑完美衔接class Solution: def nextGreatestLetter(self, letters: List[str], target: str) - str: n len(letters) left 0 right n while left right: mid left (right - left) // 2 if letters[mid] target: left mid 1 else: right mid return letters[left % n]五、代码逐行剖析与边界验证5.1 关键设计点区间与循环条件left 0、right n循环条件为left right。此时查找区间为 $[left, right)$循环结束时必有left right无需区分返回left还是right。这种排除法 左闭右开的组合正是仓库 01_14 二分查找细节 中介绍的标准边界查找写法。中间下标计算mid left (right - left) // 2用减法代替(left right) // 2从源码层面规避了整型溢出风险虽然 Python 的整数无溢出问题但这是跨语言的良好习惯。收缩规则letters[mid] target说明mid及其左侧都不是大于 target的候选等于 target 的也要排除收缩左边界left mid 1letters[mid] target说明mid是候选位置但更小的候选可能在左侧收缩右边界right mid保留mid因为mid本身可能就是答案。回绕return letters[left % n]。当left落在[0, n-1]时left % n left正常返回当left ntarget大于所有字符时left % n 0恰好返回letters[0]一条语句同时覆盖两种情形。5.2 示例逐步推演示例 1letters [c,f,j]target an 3轮次leftrightmidletters[mid]与 target 比较收缩1031ff aright 12010cc aright 0循环结束left right 0返回letters[0 % 3] c✅示例 2letters [c,f,j]target cn 3轮次leftrightmidletters[mid]与 target 比较收缩1031ff cright 12010cc cleft 1循环结束left right 1返回letters[1] f✅注意等于 target 的c被分支正确排除答案严格大于 target回绕场景letters [c,f,j]target zn 3轮次leftrightmidletters[mid]与 target 比较收缩1031ff zleft 22232jj zleft 3循环结束left right 3 n返回letters[3 % 3] c✅正确回绕到数组首元素重复字符场景letters [c,c,f,j]target cn 4。第一轮mid 2、f c令right 2第二轮mid 1、c c令left 2。循环结束返回letters[2] f同样正确跳过所有等于 target 的重复字符定位到第一个严格大于 target 的字符。六、本题与二分查找细节的对应关系仓库 01_14 二分查找二 系统总结了二分查找的四大细节区间开闭、mid 取值、循环条件、区间收缩。本题恰好可以当作这四大细节的实战校验区间开闭本题选择左闭右开 $[left, right)$ 并将right初始化为n好处是left的最终取值域天然为 $[0, n]$left n直接对应未找到需回绕的语义与% n配合天衣无缝。mid 取值mid left (right - left) // 2向下取整。由于本题收缩规则为left mid 1/right mid配对方式属于排除法 向下取整不会出现left mid导致的死循环因此无需向上取整。循环条件left right结束时left right天然收敛到唯一候选位置。区间收缩letters[mid] target时left mid 1否则right mid保证每次循环都排除掉绝不可能成为第一个大于 target 的位置的区间与「减而治之」思想完全一致。七、复杂度分析时间复杂度$O(\log n)$。每轮循环将查找区间缩小一半其中 $n$ 为字符数组letters的长度即使n取到上限 $10^4$也仅需约 $\log_2 10^4 \approx 14$ 次比较远优于线性扫描的 $O(n)$。补充说明线性扫描方案的时间复杂度为 $O(n)$。空间复杂度$O(1)$。仅使用left、right、mid等常数个变量未开辟额外存储。八、同类题目与延伸学习本题与仓库中其他二分查找题解构成循序渐进的学习链条建议按以下顺序练习0704. 二分查找二分查找入门题掌握直接法命中即返回与左闭右闭区间写法。0035. 搜索插入位置进阶边界查找寻找target的插入位置与本题寻找第一个大于 target 的位置思路几乎同构都是排除法定位第一个不小于/大于目标值的下标。0744. 寻找比目标字母大的最小字母本题在边界查找基础上叠加回绕语义用% n统一处理常规与越界情形。若想系统夯实二分查找功底可回到仓库的 01_13 二分查找算法一 与 01_14 二分查找算法二 通读算法思想、区间写法与死循环规避技巧再回到 二分查找分类题单 刷完整个二分查找专题。赞分享教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载相关推荐leetcode 题解·每日一题744. Find Smallest Letter Greater Than Target——有序字符数组二分查找的边界与环绕实战leetcode 题解·每日一题744. Find Smallest Letter Greater Than Target——有序字符数组二分查找的边界与环绕文档教程知识库gogcli 实战用 gog sheets reorder-tab 重排 Google Sheets 标签页顺序gogcli 实战用 gog sheets reorder tab 重排 Google Sheets 标签页顺序 gog sheets reorder tab教程文档知识库二分查找的本质LeetCode 153 寻找旋转排序数组中的最小值中等题解全解析二分查找的本质LeetCode 153 寻找旋转排序数组中的最小值中等题解全解析 本文是「宫水三叶的刷题日记」系列在 LogicStack LeetCod教程文档上一篇Arduino ESP32 开发环境搭建全攻略告别安装翻车一次成功上手物联网开发下一篇老视频放大就糊这个开源工具用AI做视频超分辨率实测一次就上手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考