旋转数组的最小数字(改造二分法)
旋转数组的最小数字(改造二分法)
是什么?
把一个数组最开始若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小数元素。例如,数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.
思路?
根据题目所给的数组,我们可以来了解到。输入一个递增排序的数组的一个旋转,这个旋转的数组有一定的规律。我们可以使用类似于二分法来计算,方便得出结果。
解法?
方法1(改造二分法,递归形式):
def gaizaoerfenfa(x,y,z):
item=(y+z)//2
if x[y]<x[item]:
return gaizaoerfenfa(x,item,z) //最小值在右边
elif x[y]>x[item]:
return gaizaoerfenfa(x,y,item) //最小值在左边
if y==item or z==item:
return x[z]
a=[]
for i in input().split(' '):
a.append(eval(i))
b=len(a)
num=gaizaoerfenfa(a,0,b-1)
print(num)
方法2(改造二分法,非递归形式,即指的是迭代形式):
a=[]
for i in input().split(' '):
a.append(eval(i))
b=0
c=len(a)-1
while 1>0:
item=(b+c)//2
if b==item or c==item:
print(a[c])
break
elif a[b]>a[item]:
c=item
elif a[b]<a[item]:
b=item
如下图所示:
重点思路: 只要是存在一个数据大部分上都是有序的,个别几个无序。为了提升算法效率,我们可以采用类似于二分法的方式,将一半数据抛开,在另一半中查找。