题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组[3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(rotateArray):
if len(rotateArray)==0:
return 0
if len(rotateArray)==1: #长度为1,返回这个数
return rotateArray[0]
l=len(rotateArray)
s,e=0,l-1
while(s<e):
mid=(s+e)//2
if rotateArray[mid]<rotateArray[mid-1]:
return rotateArray[mid]
elif rotateArray[mid]>=rotateArray[e]:
#相当于两个严格递增数组拼接到一起,这是我解题的关键
s=mid+1
else:
e=mid
print(s)
return rotateArray[s] #或者 return rotateArray[l-1]
#针对列表中有两个数,如[3,4]旋转成[4,3]的时候。
# write code hereif
minNumberInRotateArray([7,8,5])
# write code hereif
上述代码在牛客网上测试通过所有用例,但是呢,事实证明,上面的是“不对”的,因为在leetcode上运行并没有完全通过,原因是没有考虑 3313,51555这种重复的情况,稍改如下,在力扣上测试通过。
class Solution:
def minArray(self, numbers: List[int]) -> int:
if len(numbers)==0:
return 0
if len(numbers)==1: #长度为1,返回这个数
return numbers[0]
l=len(numbers)
s,e=0,l-1
while(s<e):
mid=(s+e)//2
print(s,e)
if numbers[mid]<numbers[mid-1]:
#print("ok",mid-1)
return numbers[mid]
elif numbers[mid]>numbers[e]:
s=mid+1
elif numbers[mid]<numbers[e]:
e=mid
else:
e-=1 #更改的地方
return numbers[s]