有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素-0430

#思路:,
# 原来有序的数组,右移n位后,以最小值与最大值的临界位置划分,两段各还是有序的。7,8,9,1,2,3,4,5,6
#对于有序的查找,思想是有二分查找。但这是局部有序,所以稍微变点型。

###方法2: 此只是要找最小值(其实找到最小值就是分界点位置了)。
#用二分的思想,可以发现,当middle<end时,则右侧有序(从中间到最后的这段都有序),无序的肯定在左侧即最小值肯定在左侧。只需关注左侧位置了
#当middle>end,这无序的肯定在右侧了。此时可以确定将结果缩小到nums[middle+1 : end]这个范围内。将end返回即为第一个最小值了
# 而当nums[middle]==nums[right]nums[middle]==nums[right]时,无法确定最小值的位置,此时可以做的事情是尽量缩小范围,又因为知道nums[middle]和nums[right]值相同,
# 所以nums[right]可以抛弃,即将结果范围缩小到nums[left : right-1]重新计算(注意,目的是找最小值而不是第一个最小值的位置,
# 所以就算nums[right]是第一个最小值也无关紧要).
###方法2 更好!

class solution:
    def findMin(a):
        length=len(a)
        start=0
        end=length-1
        while(start<end):
            middle=(start+end)//2
            if a[middle]<a[end]:
                end=middle
            elif a[middle]>a[end]:
                start=middle+1
        return a[start]
         
    s=[7,8,9,10,11,12,13,14,1,2,3,4,5,6]
    mins=findMin(s)
    print(mins)

 


### 方法1,先查找到分界点位置,利用二分查找。如果中间值小于start处的值,则分界点在左侧;大于右侧的值,则分解点在右侧。
# 用一个全局变量保留上一个middel值,继续在含分界点处的一侧遍历。当新的middle满足 start<middle<end时,上一个middle即为中间值
#找到中间分界值后,对两个有序遍历各进行二分搜索
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值