循环有序数组中查找某个数

循环有序数组中查找某个数

利用二分查找,  一个循环有序数组从中间切分,一定分成一个有序数组和一个循环有序数组,由于循环有序数组不容易判断,我们只需判断哪一边是有序数组以及target是不是在有序数组这一边。

# 循环有序数组查找某个数
def find(ls, target):
    if not ls or not target:
        return -1
    low = 0
    high = len(ls) - 1
    # 一个循环有序数组从中间切分,一定分成一个有序数组和一个循环有序数组,
    # 由于循环有序数组不容易判断,我们只需判断哪一边是有序数组以及target是不是在有序数组这一边
    while low <= high:
        mid = (low+high) // 2
        if ls[mid] == target:
            return mid
        # 若左半部分为有序数组,右半部分为循环有序数组
        if ls[mid] >= ls[low]:
            if ls[low] <= target < ls[mid]:
                high = mid-1
            else:
                low = mid+1
        # 若右半部分为有序数组,左半部分为循环有序数组
        else:
            if ls[mid] < target <= ls[high]:
                low = mid+1
            else:
                high = mid-1
    return -1
ls = [12,16,18,20,41,100,1,4,6,9]
target = 90
print(find(ls, target))

同类型题目:旋转数组的最小数

将求最小数转化为求旋转数组的转折点,一个循环有序数组从中间切分,一定分成一个有序数组和一个循环有序数组,转折点一定在无序的那边。

class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        if not rotateArray:
            return 0
        low = 0
        high = len(rotateArray) - 1
        while rotateArray[low] >= rotateArray[high]:
            if high - low <= 1:
                return rotateArray[high]
            mid = (high+low)//2
            if rotateArray[high] == rotateArray[low] and rotateArray[mid] == rotateArray[low]:
                return self.normal_find(rotateArray)
            #左边为有序,在右边寻找转折点(最小数)
            if rotateArray[mid] >= rotateArray[low]:
                low = mid
            # 右边为有序,在左边寻找转折点(最小数)
            elif rotateArray[mid] <= rotateArray[high]:
                high = mid
                
    def normal_find(self, rotateArray):
                # write code here
        if len(rotateArray) == 0:
            return 0
        for i in range(1,len(rotateArray)-1):
            if rotateArray[i-1] <= rotateArray[i] <= rotateArray[i+1]:
                pass
            else:
                return rotateArray[i+1]

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值