旋转数组的最小数字

题解方法

  • 二分查找

二分查找

  • 序列变为分段有序,第一段序列的数值均大于 nums[0],第二段则反之
  • 当旋转点使得相同的数值发生分裂,则上述特性失效,故需要预处理,左移右边界
  • 特殊考虑旋转了 0 个数值的情况,即本身有序

核心代码

二分查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 排除末尾与首位相等的情况
while (l < r && numbers[r] == numbers[0]) {
r--;
}

while (l < r) {
int mid = l + (r - l) / 2;
if (numbers[mid] < numbers[0]) {
r = mid;
} else {
l = mid + 1;
}
}
// 排除本身有序的情况
return Math.min(numbers[l], numbers[0]);

题目来源

剑指 Offer 11. 旋转数组的最小数字 - 力扣(LeetCode)