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

旋转数组的最小数字

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

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param nums int整型一维数组 
# @return int整型
#
class Solution:
    def minNumberInRotateArray(self , nums: List[int]) -> int:
        #该题比较中间值与最右边的值的大小,如果中间值大于最右边,那说明列表已经发生了旋转,最小值肯定在右边,如果中间值小于最右边,那说明列表没有发生反转,最小值还是在左边,
        # write code here
        left,right=0,len(nums)-1
        
        # 列表的(左+右)//2就是中间的数值。
        while left <right:
            mid=(left+right)//2  # 偶数个比较靠左
            if nums[mid] < nums[right]:
                right=mid
            elif nums[mid]>nums[right]:
                left=mid+1
            else:
                right=right-1

        return nums[right]
        


该题的核心在于:right就是最小值的下标。

如果mid<right,说明还是非降序,证明列表还没有被旋转,那么最小值肯定在左边,如果mid二分到最后一个数,那么mid就是最小值,所以right=mid;

如果mid>right,那就说明这一部分是原列表的尾部和旋转之后的部分连在一起了,那么最小值一定在右边;

如果mid=right,就将right-1,因为right-1,肯定是等于mid,或者是等于于mid相同的值的元素,这样不会丢掉数据。

全部评论

相关推荐

12-27 22:28
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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