剑指Offer(Python多种思路实现):旋转数组的最小数字
题目:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0
解题思路一:二分查找
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if not rotateArray:
return
if len(rotateArray)==0:
return 0
index1=0
index2=len(rotateArray)-1
indexMid=index1
while (rotateArray[index1]>=rotateArray[index2]):
if (index2-index1)==1:
indexMid=index2
break
indexMid = (index1+index2)//2
# 如果index1 index2 indexMid三者相等
if rotateArray[index1]==rotateArray[index2] and rotateArray[indexMid]==rotateArray[index1]:
return self.minValue(rotateArray,index1,index2)
if rotateArray[indexMid]>=rotateArray[index1]:
index1=indexMid
if rotateArray[indexMid]<=rotateArray[index2]:
index2=indexMid
return rotateArray[indexMid]
def minValue(self,rotateArray,index1,index2):
res=rotateArray[index1]
for i in range(index1+1,index2+1):
if res>rotateArray[i]:
res=rotateArray[i]
return res
解题思路二:
# 递增数组旋转后的数组,找出最小元素。
class Solution:
def minNum(self, numbers):
if not numbers: return None
if len(numbers)==0: return None
p1, p2 = 0, len(numbers)-1
pMid = p1
while(numbers[p1] >= numbers[p2]): # 制定循环
if(p2-p1) == 1:
pMid = p2
break
pMid = (p1+p2)//2
if numbers[p1]==numbers[p2] and numbers[pMid]==numbers[p1]: # 三者相等
return self.minValue(numbers, p1, p2) # 只能用顺序查找了
if numbers[pMid] >= numbers[p1]:
p1 = pMid # p1指向中间数字
if numbers[pmid] <= numbers[p2]:
p2 = pMid
return numbers[pMid]
def minValue(self, numbers, p1, p2):
res = numbers[p1]
for i in range(p1+1, p2+1):
if res>numbers[i]:
res = numbers[i]
return res