题目
给定一个 只包含小写字母的有序数组 letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母。
数组里字母的顺序是循环的。举个例子,如果目标字母 target = z 并且有序数组为 letters = ['a', 'b'],则答案返回 a。
示例:
输入:letters = ["c", "f", "j"]target = "a"输出: "c"输入:letters = ["c", "f", "j"]target = "c"输出: "f"输入:letters = ["c", "f", "j"]target = "d"输出: "f"输入:letters = ["c", "f", "j"]target = "g"输出: "j"输入:letters = ["c", "f", "j"]target = "j"输出: "c"输入:letters = ["c", "f", "j"]target = "k"输出: "c"
注:
letters长度范围在[2, 10000]区间内。letters仅由小写字母组成,最少包含两个不同的字母。- 目标字母
target是一个小写字母。
方案一(二分查找,模板三)
func nextGreatestLetter(letters []byte, target byte) byte {
// 特殊情况处理
if target < letters[0] || target >= letters[len(letters)-1] {
return letters[0]
}
// 二分查找
var left, right = 0, len(letters) - 1
for left + 1 < right {
var mid = (left + right) / 2
// if letters[mid] == target {
// return letters[mid+1]
// } else
if letters[mid] > target && letters[mid - 1] < target {
return letters[mid]
} else if letters[mid] > target {
right = mid
} else {
left = mid
}
}
// 尾处理: 结束条件 left + 1 == right
var index int
if letters[right] > target {
index = right
}
if letters[left] > target {
index = left
}
return letters[index]
}
- 注意上述代码中注释掉的部分,这样的判断是错误的, eg.
["e", "e", "e", "e", "e", "e", "n", "n", "n", "n"]
原文
https://leetcode-cn.com/explore/learn/card/binary-search/213/conclusion/852/
