题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素,例如,数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组最小的值为1
递增数组(非严格)可以通过二分查找来解决问题,非严格递增需要顺序查找,旋转数组分为两个部分,第一部分的数字比第二部分的数字大,跳出迭代的条件是左右指针相邻,如果左边部分比右边部分小,说明数组没有旋转,这个时候直接返回数组第一个元素即可
class Solution:
def get_min(self, seq):
if not seq:
raise Exception("input wrong")
length = len(seq)
index_1 = 0
index_2 = length - 1
index_mid = index_1
while seq[index_1] >= seq[index_2]:
if index_2 - index_1 == 1:
index_mid = index_2
break
index_mid = (index_2 + index_1) // 2
if seq[index_1] == seq[index_2] and seq[index_2] == seq[index_mid]:
return self.get_min_inorder(seq, index_1, index_2)
if seq[index_mid] <= seq[index_1]:
index_2 = index_mid
elif seq[index_mid] >= seq[index_2]:
index_1 = index_mid
return seq[index_mid]
def get_mid_inorder(self, seq, index_1, index_2):
result = index_1
for i in range(index_1+1, index_2+1):
if seq[i] < seq[result]:
result = i
return seq[result]
网友评论