2020-10-03

    科技2022-07-11  92

    题目描述

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

    # -*- coding:utf-8 -*- class Solution: def minNumberInRotateArray(rotateArray): if len(rotateArray)==0: return 0 if len(rotateArray)==1: #长度为1,返回这个数 return rotateArray[0] l=len(rotateArray) s,e=0,l-1 while(s<e): mid=(s+e)//2 if rotateArray[mid]<rotateArray[mid-1]: return rotateArray[mid] elif rotateArray[mid]>=rotateArray[e]: #相当于两个严格递增数组拼接到一起,这是我解题的关键 s=mid+1 else: e=mid print(s) return rotateArray[s] #或者 return rotateArray[l-1] #针对列表中有两个数,如[3,4]旋转成[4,3]的时候。 # write code hereif minNumberInRotateArray([7,8,5]) # write code hereif

    上述代码在牛客网上测试通过所有用例,但是呢,事实证明,上面的是“不对”的,因为在leetcode上运行并没有完全通过,原因是没有考虑 3313,51555这种重复的情况,稍改如下,在力扣上测试通过。

    class Solution: def minArray(self, numbers: List[int]) -> int: if len(numbers)==0: return 0 if len(numbers)==1: #长度为1,返回这个数 return numbers[0] l=len(numbers) s,e=0,l-1 while(s<e): mid=(s+e)//2 print(s,e) if numbers[mid]<numbers[mid-1]: #print("ok",mid-1) return numbers[mid] elif numbers[mid]>numbers[e]: s=mid+1 elif numbers[mid]<numbers[e]: e=mid else: e-=1 #更改的地方 return numbers[s]
    Processed: 0.010, SQL: 8