剑指Offer 6. 旋转数组的最小数字 (数组)

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

题目地址

https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=11159&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路

旋转之后的数组可以划分成两个有序的子数组,前面子数组的元素都大于后面子数组的元素,并且第一个元素大于最后一个元素

最小的元素就是两个子数组的分界线

使用二分查找,O(logn)

使用两个指针分别指向数组的第一个和最后一个元素

1 若中间元素小于它前一个元素,则中间元素为最小

2 若中间元素大于右边界,此时最小值位于中间元素之后(mid+1,r),左指针指向中间元素加1

3 若中间元素小于右边界,此时最小元素位于中间元素的前面(l, mid-1),右指针指向中间元素减1.

Python

# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        if not rotateArray:
            return 0
        if len(rotateArray) == 1:
            return rotateArray[0]
        l, r = 0, len(rotateArray) - 1
        while l <= r:
            mid = (l + r) // 2
            if rotateArray[mid] < rotateArray[mid - 1]:
                return rotateArray[mid]
            elif rotateArray[mid] > rotateArray[r]:
                l = mid + 1
            elif rotateArray[mid] < rotateArray[r]:
                r = mid - 1
        # return rotateArray[mid]
if __name__ == '__main__':
    result = Solution().minNumberInRotateArray([3,4,5,1,2])
    print(result)

猜你喜欢

转载自www.cnblogs.com/huangqiancun/p/9777569.html
今日推荐