0744. 寻找比目标字母大的最小字母 Find Smallest Letter Greater Than Target
这个可以用二分查找法, 它要找到比目标元素 target
大的第一个元素.
二分查找法
思路是排除法, 因为左侧的元素较小, 优先排除左侧部分. 步骤如下:
- 创建两个指针, 分别指向数组的左右两侧
- 开始二分查找, 计算中间节点 middle 的值, 并判断:
- 如果
letters[middle] >= target
, 说明[left..middle]
区间的字符较小, 将 left 指针向右移, 令left = middle + 1
- 否则, 说明
[middle..right]
的字符都是比target
大的, 将 right 指针左移, 令right = middle
- 如果
- 当
left == right
时, 终止循环, 确认一下 left 位置的字符是不是目标
#![allow(unused)] fn main() { // Binary Search pub fn next_greatest_letter1(letters: Vec<char>, target: char) -> char { debug_assert!(letters.len() >= 2); let mut left = 0; let mut right = letters.len() - 1; while left < right { let middle = left + (right - left) / 2; if letters[middle] <= target { // 如果 middle 处的字符小于或者等于 target, 就将 left 向右移 left = middle + 1; } else { // 如果 middle 处的字符大于 target, 就将 right 向左移 right = middle; } } // 要判断有没有找到 if letters[left] > target { letters[left] } else { letters[0] } } }
时间复杂度是 O(log(n))
.