旋转数组的最小数字(改造二分法)

旋转数组的最小数字(改造二分法)

是什么?

把一个数组最开始若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小数元素。例如,数组{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

 

如下图所示:

重点思路: 只要是存在一个数据大部分上都是有序的,个别几个无序。为了提升算法效率,我们可以采用类似于二分法的方式,将一半数据抛开,在另一半中查找。

posted @ 2022-02-26 15:25  天空之城—我的理想国  阅读(24)  评论(0编辑  收藏  举报