旋转数组的最小数字
描述
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1≤n≤10000
,数组中任意元素的值0≤val≤10000
要求:空间复杂度O(1),时间复杂度O(logn)
示例1
1 | 输入: [3,4,5,1,2] |
示例2
1 | 输入: [3,100,200,3] |
题解
- 数组可以分为两个有序的子数组。其中,左排序的数组的值大于右排序数组中的值
- 声明left,right 分别指向数组的左右两端
- mid = (left+right) / 2 为二分的中间位置
- mid,left,right分为三种情况
rotateArray[mid] > rotateArray[right]
时, 那么 最小值一定在 [mid+1,right]区间中rotateArray[mid] < rotateArray[right]
时,那么最小值一定在[left,mid]区间内rotateArray[mid] = rotateArray[right]
时,无法判断最小值在哪个区间,所以此时只能缩小right的值
1 | package main |