5旋转数组的最小数字
5旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
有重复元素。
思路:使用二分搜索
- 如果
nums[mid] > nums[right]
,说明最小值在右半部分,将左指针left
移动到mid + 1
。 - 如果
nums[mid] < nums[right]
,说明最小值在左半部分或者就是nums[mid]
,将右指针right
移动到mid
。 - 如果
nums[mid] == nums[right]
,无法确定最小值在左半部分还是右半部分,将右指针right
向前移动一位。
func minNumberInRotateArray( nums []int ) int { // write code here if len(nums) == 0 { return -1 } start := 0 end := len(nums) - 1 mid := start + (end - start) / 2 for start + 1 < end { mid = start + (end - start) / 2 if nums[mid] > nums[end] { start = mid + 1 } else if nums[mid] < nums[end] { end = mid } else { end-- } } if nums[start] < nums[end] { return nums[start] } return nums[end] }