# [153. Find Minimum in Rotated Sorted Array](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/) ## 题目 Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., `[0,1,2,4,5,6,7]` might become `[4,5,6,7,0,1,2]`). Find the minimum element. You may assume no duplicate exists in the array. **Example 1**: Input: [3,4,5,1,2] Output: 1 **Example 2**: Input: [4,5,6,7,0,1,2] Output: 0 ## 题目大意 假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。 你可以假设数组中不存在重复元素。 ## 解题思路 - 给出一个原本从小到大排序过的数组,但是在某一个分割点上,把数组切分后的两部分对调位置,数值偏大的放到了数组的前部。求这个数组中最小的元素。 - 求数组最小的元素其实就是找分割点,前一个数比当前数大,后一个数比当前数也要大。可以用二分搜索查找,需要查找的两个有序区间。时间复杂度 O(log n)。这一题也可以用暴力解法,从头开始遍历,动态维护一个最小值即可,时间复杂度 O(n)。 ## 代码 ```go package leetcode // 解法一 二分 func findMin(nums []int) int { low, high := 0, len(nums)-1 for low < high { if nums[low] < nums[high] { return nums[low] } mid := low + (high-low)>>1 if nums[mid] >= nums[low] { low = mid + 1 } else { high = mid } } return nums[low] } // 解法二 二分 func findMin1(nums []int) int { if len(nums) == 0 { return 0 } if len(nums) == 1 { return nums[0] } if nums[len(nums)-1] > nums[0] { return nums[0] } low, high := 0, len(nums)-1 for low <= high { mid := low + (high-low)>>1 if nums[low] < nums[high] { return nums[low] } if (mid == len(nums)-1 && nums[mid-1] > nums[mid]) || (mid < len(nums)-1 && mid > 0 && nums[mid-1] > nums[mid] && nums[mid] < nums[mid+1]) { return nums[mid] } if nums[mid] > nums[low] && nums[low] > nums[high] { // mid 在数值大的一部分区间里 low = mid + 1 } else if nums[mid] < nums[low] && nums[low] > nums[high] { // mid 在数值小的一部分区间里 high = mid - 1 } else { if nums[low] == nums[mid] { low++ } if nums[high] == nums[mid] { high-- } } } return -1 } // 解法三 暴力 func findMin2(nums []int) int { min := nums[0] for _, num := range nums[1:] { if min > num { min = num } } return min } ```