原题
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
My Answer
解题思路:
利用二分法进行查找最小数,尤其要注意的是这里判别条件是if end - start > 1:
不再是 end > start
,而是要间隔到1,因为事实上,带入输入[3,4,5,1,2]会发现,end到后面一直为3,start一直为2,mid在2与3之间徘徊,如果采用 end > start
势必陷入死循环,故而在这里让其间隔为1时,完成循环查找,只需在两者之间找到一个最小数返回即可。
# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if not rotateArray:
return 0
start, end, mid = 0, len(rotateArray) - 1, (len(rotateArray) - 1)/2
while True:
#rotateArray = rotateArray[start:end]
if end - start > 1:
mid = int(start + end)/2)
if rotateArray[mid] < rotateArray[end]:
# the back of array is the sorted
end = mid
else: # find the reverse list in the back of array
start = mid
else:
if rotateArray[start] < rotateArray[end]:
return rotateArray[start]
else:
return rotateArray[end]
参考答案
解题思路:
使用二分法,但要考虑[1, 0, 0, 1]这种数据,只能顺序查找
def find_min(nums):
if not nums:
return False
length = len(nums)
left, right = 0, length - 1
while nums[left] >= nums[right]:
if right - left == 1:
return nums[right]
mid = (left + right) / 2
if nums[left] == nums[mid] == nums[right]:
return min(nums)
if nums[left] <= nums[mid]:
left = mid
if nums[right] >= nums[mid]:
right = mid
return nums[0]
注:参考答案只是将 if right - left == 1:
放到了循环里面判断罢了,其本质与自身答案一样。