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