把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
【1】二分查找
先判断第一个值是不是大于最后一个值?若是,则有序,直接返回第一个值;若不是,else:
指针p指向位置0,指针q指向位置n,指针i指向中间位置 (q+p)/2 向下取整
若i值大于p值,说明i在前一段,要找的数在i后面,要移动p,使p=i,i=(q+p)/2
若i值小于q值,说明i在后一段,要找的数在i前面,要移动q,使q=i,i=(q+p)/2
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
length = len(rotateArray)
if length==0:
return 0
elif rotateArray[0] < rotateArray[-1]:
return rotateArray[0]
else:
p = 0
q = length-1
i = (p+q)/2
while(p<=q):
if q-p == 1:
i = q
break # 此处重要
i = (p+q)/2
if rotateArray[i] == rotateArray[p] == rotateArray[q]:
return self.ordersearch(rotateArray, p, q) # 此处重要
if rotateArray[i]>=rotateArray[p]:
p = i
elif rotateArray[i]<=rotateArray[q]:
q = i
return rotateArray[i]
def ordersearch(self, A, left, right):
res = A[left]
for i in range(left, right + 1):
res = min(res, A[i])
return res
特殊情况
[1,0,1,1,1]和[1,1,1,0,1]都是[0,1,1,1,1]的旋转,这两种情况中,p 和 q 指向的数字都是1,并且i指向的也是1,即array[p]==array[q]==array[i]
在[1,0,1,1,1]中,i之间的1在后一段;在[1,1,1,0,1]中,i指向的1在前一段。
【2】顺序查找
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
length = len(rotateArray)
if length==0:
return 0
else:
res = rotateArray[0]
for num in rotateArray:
if num < res:
return num
return res
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if len(rotateArray)==0:
return 0
else:
res = rotateArray[0]
for num in rotateArray:
if num<res:
return num
return res
下面这种方法,比较的是前后相邻两个,需要吗,把顺序与第一个值比较不行?反正前一段是you
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
pre = -7e20
for num in rotateArray:
if num < pre :
return num
pre = num
if len(rotateArray) == 0:
return 0
return rotateArray[0]