1、题目描述:
2、题解:
方法1:暴力法
设置一个变量res=numbers[0]
然后遍历numbers数组,更新最小值
返回res
class Solution:
def minArray(self, numbers: [int]) -> int:
#暴力法
if not numbers:return -1
n = len(numbers)
res = numbers[0]
for i in range(1,n):
if numbers[i] < res:
res = numbers[i]
return res
方法2:二分查找
这个要对二分查找进行改变,我们找的是右排序数组的首个元素numbers[x],x称为旋转点.
对于[3,4,5,1,2,3]来说,[3,4,5]是左排序数组,[1,2,3]是右排序数组,可以发现,左排序数组的任意值>=右排序数组的任意值
。
在循环体中:
因为mid是向下取整,因此,left<=mid<right
1、当numbers[mid] > numbers[right],也就是说mid一定在左排序数组中,即旋转点x一定在[mid+1,right]
中,所以left = mid +1
2、当numbers[mid] < numbers[right],也就是说mid一定在右排序数组中,即旋转点x一定在[left,mid]中,
所以right=mid
3、当numbers[mid] == numbers[right],无法肯定的说明mid在哪边,我们缩小范围right -= 1
python代码如下:
class Solution:
def minArray(self, numbers: [int]) -> int:
#二分查找
left,right = 0 ,len(numbers) - 1
while left < right:
mid = (left + right) >> 1
#mid = left + (right - left) // 2
if numbers[mid] > numbers[right]:
left = mid + 1
elif numbers[mid] < numbers[right]:
right = mid
elif numbers[mid] == numbers[right] :
right -= 1
return numbers[left]
3、复杂度分析:
方法1:
时间复杂度:O(N)
空间复杂度:O(1)
方法2:
时间复杂度:O(logN)
空间复杂度:O(1)