剑指offer 7. 旋转数组的最小数字

原题

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{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:放到了循环里面判断罢了,其本质与自身答案一样。

猜你喜欢

转载自blog.csdn.net/Dby_freedom/article/details/83176382