题目:
给你一个字符数组 letters,该数组按非递减顺序排序,以及一个字符 target。letters 里至少有两个不同的字符。 返回 letters 中大于 target 的最小的字符。如果不存在这样的字符,则返回 letters 的第一个字符。
算法:
方法一:二分查找,注意边界条件
- 大于,小于是否包括等于
- left==right时应该如何处理
func nextGreatestLetter(letters []byte, target byte) byte {
left, right := 0, len(letters) - 1
for left < right {
mid := (left + right) / 2
if letters[mid] <= target {
left = mid + 1
} else if letters[mid] > target {
if mid - 1 < 0 || letters[mid - 1] <= target {
return letters[mid]
} else {
right = mid - 1
}
}
}
if letters[left] > target {
return letters[left]
}
return letters[0]
}
逼近思想,另一种比较简洁的二分写法:
func nextGreatestLetter(letters []byte, target byte) byte {
left, right := 0, len(letters) - 1
for left < right {
mid := (left + right) / 2
if letters[mid] > target {
right = mid
} else {
left = mid + 1
}
}
if letters[left] > target {
return letters[left]
}
return letters[0]
}