题目:
讲道理,这个总需要解释下旋转数组是什么
比如{3,4,5,1,2} 是{1,2,3,4,5}的一个旋转
就酱
顺着找是O(n),既然是两边都有序,那么我们类二分的找一下
大致就是二分的思路
两个指针,一个头一个尾,如果mid比第一个大,那么是前面那个有序数组的,要找的最小的肯定在右边,所以前面的移到mid如果mid小于第二个,那么后面的移到mid
找到的条件是两个指针的距离为1
注意
可能是一个全部有序的数组
还有可能 1 0 1 1 1
这样,不知道这个1是前面的还是后面的,遇到这样的情况只能顺序查找了
代码:
def minNumberInRotateArray(rotateArray):
i,j = 0,len(rotateArray)-1
mid = 0
while rotateArray[i] >= rotateArray[j]:
if j - i == 1:
mid = j
break
mid = (i + j) / 2
if rotateArray[i] == rotateArray[mid] and rotateArray[j] == rotateArray[mid]:
mid = minNumber(rotateArray)
break
if rotateArray[i] <= rotateArray[mid]:
i = mid
elif rotateArray[mid] <= rotateArray[j]: # 这一点刚开始写错了,没有和后面那个比较,想简单了,只和前面的比了
j = mid
return rotateArray[mid]
def minNumber(rotateArray):
if len(rotateArray) == 0:
return 0
if len(rotateArray) == 1:
return rotateArray[0]
for i in range(0,len(rotateArray)):
if rotateArray[i] < rotateArray[i-1]:
return i
然后决定用python开一下挂
def minNumberInRotateArray(self,rotateArray):
if len(rotateArray) == 0:
return 0
sort(rotateArray)
return rotateArray[0]
当我以为我开了挂的时候,网上的大神教会了我做人🙋
def minNumberInRotateArray(self, rotateArray):
# write code here
if len(rotateArray) == 0:
return 0
return min(rotateArray)