循环有序数组中查找某个数
利用二分查找, 一个循环有序数组从中间切分,一定分成一个有序数组和一个循环有序数组,由于循环有序数组不容易判断,我们只需判断哪一边是有序数组以及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]