时间复杂度:O(log n)
解题思路
二分查找的思路。通过比较nums[mid]与nums[high]的大小确定如何更新low和high。当数组旋转后,最小值及右侧的元素都是小于nums[high]的,而最小值左侧的所有元素都是大于nums[high]的,所以nums[mid]与nums[high]比较大小后我们便可确定mid是处于最小值左侧还是右侧(包括最小值)。如果nums[mid]小于nums[high]那么mid处于最小值及最小值右侧,所以接下来要向左寻找最小值,更新high为mid(不是mid-1的原因是nums[mid]可能就是最小值);否则,mid处于最小值左侧,接下来要向右寻找最小值,所以更新low为mid+1。
当low和high相等时,mid位置唯一确定,此时的nums[low]就是我们寻找的最小值。
AC代码
func findMin(nums []int) int {
low,high:=0,len(nums)-1
for low<high{
mid:=low+(high-low)>>1
if nums[mid]<nums[high]{
high=mid //nums[mid]可能就是最小值,所以更新high为mid而不是mid-1
}else{
low=mid+1
}
}
return nums[low]
}
感悟
之前做过“33.搜索旋转排序数组”,但是按照那道题的思路没有做出来,不清楚该如何更新low和high,看了题解后恍然大悟,原来只和nums[high]比较大小即可确定如何更新low和high。