剑指Offer编程题-旋转数组的最小数字
题目:旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路
旋转数组为非减排序,那么最小值可以将数组划分为两个非减排序的数组。
- 从前往后、从后往前同时查找
- 二分法查找
实现
python
方法一(复杂度较高):
-*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if not rotateArray:
return 0
m = 0
n = len(rotateArray)-1
mi = rotateArray[0]
while mrotateArray[m+1]:
mi = rotateArray[m+1]
break
if rotateArray[n-1]>rotateArray[n]:
mi = rotateArray[n]
break
m = m + 1
n = n - 1
return mi
二分查找(一):
-*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if not rotateArray:
return 0
low = 0
high = len(rotateArray) - 1
while low < high:
mid = int((low + high) / 2)
if rotateArray[mid]>rotateArray[high]:
low = mid + 1
elif rotateArray[mid] < rotateArray[low]:
high = mid
elif rotateArray[low] == rotateArray[high]:
low = low + 1
high = high - 1
else:
break
return rotateArray[low]
二分查找(二):
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if not rotateArray:
return 0
low = 0
high = len(rotateArray) - 1
while low < high-1:
mid = int((low + high) / 2)
if rotateArray[mid]>rotateArray[high]:
low = mid
elif rotateArray[mid] < rotateArray[low]:
high = mid
elif rotateArray[low] == rotateArray[high]:
low = low + 1
high = high - 1
else:
break
return rotateArray[low] if rotateArray[low] < rotateArray[high] else rotateArray[high]