File tree Expand file tree Collapse file tree 1 file changed +56
-0
lines changed
docs/algorithm/research/binary-search Expand file tree Collapse file tree 1 file changed +56
-0
lines changed Original file line number Diff line number Diff line change @@ -937,6 +937,62 @@ class Solution:
937937 return arr[left:left + k]
938938```
939939
940+ ## 744. 寻找比目标字母大的最小字母
941+
942+ [ 原题链接] ( https://leetcode-cn.com/problems/find-smallest-letter-greater-than-target/ )
943+
944+ ### 思路
945+
946+ 给你一个** 排序后的字符列表** ,和一个** 目标字母** ,要查找比这个字母** 大** 的** 最小字母** ,很容易就想到** 二分查找** 。
947+
948+ 因为「在比较时,字母是依序循环出现的」,所以我们可以先处理特殊情况:** 当我们要查找的字母大于等于列表的最后一个字母时,直接返回列表第一字母** 。
949+
950+ 下面说说二分查找。
951+
952+ 首先定义好模板:
953+
954+ ``` python
955+ left = 0
956+ right = length
957+
958+ while left < right:
959+ mid = (left + rigt) // 2
960+ letter = letters[mid]
961+ # 其他逻辑……
962+ ```
963+
964+ 此处我们取到的中间值 ` letter ` 与 ` target ` 存在三种大小关系:
965+
966+ - ` letter == target ` :两者相等。此时说明我们已经找到了目标字母,但我们要找的是比目标字母大的最小字母,所以我们需要把查找范围变成 ` mid ` 右侧,继续向更大的字母范围处查找,即 ` left = mid + 1 `
967+ - ` letter < target ` :当前字母小于目标字母,说明目标值在 ` mid ` 右侧,同上 ` left = mid + 1 `
968+ - ` letter > target ` :当前字母大于目标字母。此时当前字母可能就是我们要找的最终答案了,但也有可能答案在左侧范围,所以 ` right = mid ` ,** 保留当前字母位置** ,且继续向左侧查找
969+
970+ ### 具体实现
971+
972+ ``` python
973+ class Solution :
974+ def nextGreatestLetter (self , letters : List[str ], target : str ) -> str :
975+ length = len (letters)
976+ # 循环的特殊情况
977+ if letters[length - 1 ] <= target:
978+ return letters[0 ]
979+ left = 0
980+ right = length - 1
981+ while left < right:
982+ mid = (left + right) // 2
983+ letter = letters[mid]
984+ if letter == target:
985+ # 等于目标值,往右找
986+ left = mid + 1
987+ elif letter < target:
988+ # 比目标值小,往右找
989+ left = mid + 1
990+ else :
991+ # 比目标值大,可能就是要找的数!
992+ right = mid
993+ return letters[left]
994+ ```
995+
940996## 1095. 山脉数组中查找目标值
941997
942998[ 原题链接] ( https://leetcode-cn.com/problems/find-in-mountain-array/ )
You can’t perform that action at this time.
0 commit comments