5旋转数组的最小数字

5旋转数组的最小数字

 
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
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]
}

  

 

 

posted @ 2021-04-07 21:48  zqlucky  阅读(29)  评论(0编辑  收藏  举报