题解 | #旋转数组的最小数字#

旋转数组的最小数字

http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba

NC71 旋转数组的最小数字

描述 有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。

数据范围:1≤n≤10000,数组中任意元素的值: 0≤val≤10000 要求:空间复杂度:O(1) ,时间复杂度:O(logn)

和题目“NC48 在旋转过的有序数组中寻找目标值”有点像,就是这个数组是不降序的,需要再处理一下。思路是一样的

思路:数组分成两部分,左边和右边,左右内部升序,左边值不小于右边,由此二分确定分割点,最小值为分割点的值。由于考虑到类似[5,5,5,5,3,5,5,5]或[5,5,5,5,9,5,5,5]或[5,5,5,5,5,5,5,5]这种情况,所以我先用while循环确保rotateArray[left]和rotateArray[right]不相等,确定left和right。这样处理后,rotateArray[left] 一定大于 rotateArray[right],左边的值一定大于右边的值。 之后用二分。

# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param rotateArray int整型一维数组 
# @return int整型
#
class Solution:
    def minNumberInRotateArray(self , rotateArray: List[int]) -> int:
        # write code here
        if len(rotateArray) == 1:
            return rotateArray[0]
        left = 0
        right = len(rotateArray) - 1
        while (rotateArray[left] == rotateArray[right]) & (left < right):
            left += 1
        if rotateArray[left] <= rotateArray[right]:
            return rotateArray[left]
        k = (left + right) >> 1
        while left < right:
            print(rotateArray[k],rotateArray[left],rotateArray[right])
            if rotateArray[k] >= rotateArray[left]:
                if rotateArray[k + 1] < rotateArray[left]:
                    return rotateArray[k + 1]
                left = k + 1
            else:
                if rotateArray[k - 1] >= rotateArray[left]:
                    return rotateArray[k]
                right = k - 1
            k = (left + right) >> 1
全部评论

相关推荐

头像
11-03 16:48
已编辑
百度_高级研发工程师
事实是检验真理的唯一标准。&nbsp;无论我们怎么去说,去讲述,去证明,都抵不过一个offer来得实在,无论我们怎么去复现求职中的摸爬滚打、扒皮抽筋、狼狈不堪,都抵不过你在简历写上大厂的名字(外包不算)。&nbsp;所以在我求职期间,我什么话都不说,什么话都不讲,因为没有意义,虽然我总讲过程才是意义,但只有当你上岸的那一刻,你才有资格回想在水里的挣扎,只有等你出了山,你才知道山的全貌。&nbsp;我为什么一定要离开华为OD,难道它不稳定吗,不能赚钱吗。为了证明自己,那肯定有的。其实更多的是印证我的认知是否真的正确。&nbsp;(给不了解我的人交代一下背景,在下双非一本,gap一年,华为OD外包,摸爬滚打4个月,艰难上岸百度正编)一、...
先锋战士:说得很真诚。鄙视链自古有之,学历,家庭背景,财富,权利。从小有之,小学羡慕那些当班委的,中学羡慕那些学生会的,高中羡慕尖子班拿教学金的,大学羡慕高绩点,毕业了羡慕进大厂的。工作了,又羡慕高职级的,再后来又羡慕别人早早结婚的。我想表达的观点很简单,无论是华为od还是百度,都是经历,没有孰高孰低,为了抵达下一个风景,总会付出更多东西,但不就是人生吗?正如登山,每个阶段的山,都要想办法攀登,在博主的文字中,见到了坚持和积极寻找问题解决办法的心态
学历对求职的影响
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务