LeetCode旋转数组查找指定数(附pandas源码)

 LeetCode中关于旋转数组有不少,但今天的题目还是没找到,但有个类似的:山脉数组。这里试验下,

For Recommendation in Deep learning QQ Group 277356808

For deep learning QQ Second Group 629530787

I'm here waiting for you

题目:

一个数组怎么用二分查找target,肯定要logN复杂度,如果是N复杂度,这题毫无意义。
array=[3,4,5,6,0,1,2]#这个array是经过旋转后得到的数组,旋转之前是有序的
target = 5 或者 target=0

def binary_search(array, target, left, right, flag=1):
    target=flag*target
    while left <= right:
        mid = (left + right) // 2
        if flag*array[mid] == target:
            return mid
        elif flag*array[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

class Solution:
    def findInMountainArray(self, array, target):
        left, right = 0, len(array) - 1
        while left< right:
            mid = (left + right) // 2
            if array[mid] < array[mid + 1]:
                left = mid + 1
            else:
                right = mid
        peak = left
        index = binary_search(array, target, 0, peak)
        if index != -1:
            return index
        index = binary_search(array, target, peak + 1, len(array)-1, -1)
        return index

感觉有点麻烦,似乎也不对,测试结果如下: 

>>> k2 = [11, 13, 14, 15, 19, 1, 4, 7, 8]
>>> Solution2().findInMountainArray(k2,15)
3
>>> Solution2().findInMountainArray(k2,1)
-1
>>> Solution2().findInMountainArray(k2,7)
-1

【百度云链接:提取码附后面。】

 我猜测里面的-1应该是想把两个山转变成一个山,不然乘以-1有啥用,还不如我的笨方法,

思路】先寻找最小值的位置(LeetCode参考旋转数组最小值),然后对原数组以最小值处分割成两个数组,然后对这两个数组直接采用二分查找,加起来也就是3*logN的复杂度吧,还是logN吧,如下源码附上,

class Solution:
    def minArray(self, array):#先查最小值
        left, right = 0, len(array) - 1
        while left < right:
            mid = left + (right -left) // 2
            if array[mid] < array[right]:
                right = mid 
            elif array[mid] > array[right]:
                left = mid + 1
            else:
                right -= 1
        return left,array[left]
    def binSearch(self,array, x):
        left,right=0,len(array)-1
        while left<=right:
            mid =(left + right)//2
            if array[mid]==x:
                return mid
            elif array[mid]<x:
                left = mid +1
            else:
                right = mid-1
        return -1
    def func(self,array,target):
        ind,_=self.minArray(array)
        halfA,halfB = array[:ind],array[ind:]
        indA,indB = self.binSearch(halfA, target),self.binSearch(halfB, target)
        if indA!=-1:
            return indA
        elif indB!=-1:
            return indB+ind
        return -1

测试结果:

>>> k2 = [11, 13, 14, 15, 19, 1, 4, 7, 8]
>>> Solution().func(k2,15)
3
>>> Solution().func(k2,1)
5
>>> Solution().func(k2,7)
7

愿我们终有重逢之时,

而你还记得我们曾经讨论的话题。


萌宠提取码:0f2e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李飞刀李寻欢

您的欣赏将是我奋斗路上的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值