有這麼一個連續有序數組,比如1,2,3,4,5,6,7,8,9。把7,8,9移到最前面,就是7,8,9,1,2,3,4,5,6。讓你找出某個元素在數組中的索引,如果沒有則傳回-1
用python我的解法是這樣的,先把那個分界點找出來,然後切成兩個數組,判斷下該在哪個數組裡進行二分查找,然後進行二分查找:
# Online Python compiler (interpreter) to run Python online.
# Write Python 3 code in this online editor and run it.
def find_sub_arr(_arr):
sub_arr1 = []
sub_arr2 = []
i = 0
while i < len(_arr) - 1:
if _arr[i+1] != _arr[i] + 1:
sub_arr1 = _arr[:i+1]
sub_arr2 = _arr[i+1:]
i += 1
return sub_arr1, sub_arr2
def binary_search(_arr, l, r, _num):
if r >= l:
mid = int(l + (r - l)/2)
if _arr[mid] == _num:
return mid
elif _arr[mid] > _num:
return binary_search(_arr, l, mid-1, _num)
else:
return binary_search(_arr, mid+1, r, _num)
else:
return -1
def index_of(_arr, _num):
sub1, sub2 = find_sub_arr(arr)
if _num >= sub1[0]:
print(f"find {_num} in {sub1}")
return binary_search(sub1, 0, len(sub1)-1, _num)
elif _num >= sub2[0]:
print(f"find {_num} in {sub2}")
return len(sub1) + binary_search(sub2, 0, len(sub2)-1, _num)
else:
return -1
arr = [7,8,9,1,2,3,4,5,6]
print(f"arr is {arr}")
for a in arr:
ind = index_of(arr, a)
print(f"index {a} is {ind}")
print("——————————————————")