【題目】
有序陣列arr可能經過一次旋轉處理,也可能沒有,且arr可能存在重複的數。
例如,有序陣列[1,2,3,4,5,6,7],可以旋轉處理成[4,5,6,7,1,2,3] 等。
給定乙個可能旋轉過的有序陣列arr,返回arr中的最小值。
根據題目分析
有序指公升序;
旋轉處理將公升序陣列分成前後兩部分,進行整體位置交換;
可能旋轉,可能不旋轉,返回其中最小值
直接遍歷獲取最小值,時間複雜度為o(n
)o(n)
o(n)
。現在考慮公升序陣列和旋轉操作的性質,給定的陣列arr最多下降一次值(散點構成的兩條向上的直線)。
使用二分查詢的思想,平均時間複雜度為o(l
ogn)
o(logn)
o(logn
),最壞時間複雜度為o(n
)o(n)
o(n)
。思維擴充套件
同理可以在公升序旋轉陣列中找到最大值;
也可以先找到最小值的索引,最小值前一位就是最大值。(若最小值索引為0,則最大值索引為-1——len(arr) - 1)。
# 有序旋轉陣列最小值
defrotate_arr_minimum
(arr)
:if arr is
none
orlen
(arr)==0
:return
none
low =
0 high =
len(arr)-1
while low <= high:
# 包含不超過兩個值
if high - low <=1:
minimum = arr[low]
if arr[high]
< arr[low]
: minimum = arr[high]
return minimum
# 無旋轉
if arr[low]
< arr[high]
:return arr[low]
# 二分查詢
mid =
(low + high)//2
if arr[low]
> arr[mid]
: high = mid
elif arr[mid]
> arr[high]
: low = mid
else
:# arr[low] == arr[mid] == arr[high], 最小值在下面五個位置中
cand_indexes =
[low +
1, mid -
1, mid, mid +
1, high -1]
minimum = arr[cand_indexes[0]
]for index in cand_indexes:
if arr[index]
< minimum:
minimum = arr[index]
return minimum
# 簡單測試
if __name__ ==
'__main__'
: arr =[4
,5,6
,7,1
,2,3
(rotate_arr_minimum(arr)
)# 1
arr =[1
,1,1
,1,1
,1,1
(rotate_arr_minimum(arr)
)# 1
arr =[1
,0,1
,1,1
,1,1
(rotate_arr_minimum(arr)
)# 0
arr =[1
,1,1
,1,1
,0,1
(rotate_arr_minimum(arr)
)# 0
在有序旋轉陣列中查詢最小值
有序陣列a經過一次旋轉處理,也可能沒有旋轉,且a中肯能存在重複的數字。例如有序陣列 1,2,3,4,5,6 可以旋轉處理成 4,5,6,1,2,3 特例一,1,2,3,4,4,4,4,4,4 旋轉成 4,4,4,4,4,1,2,3,4 特例二,1,2,3,4,4,4,4,4,4 旋轉成 4,1,2,...
在有序旋轉陣列中找到最小值
題目 有序陣列arr可能經過一次旋轉處理,也可能沒有,且arr可能存在重複的數。例如,有序陣列 1,2,3,4,5,6,7 可以旋轉處理成 4,5,6,7,1,2,3 等。給定乙個可能旋轉過的有序陣列arr,返回arr中的最小值。基本思路 盡可能的利用二分查詢,但是最壞情況仍然無法避免o n 的時間...
在有序旋轉陣列中找到最小值
在有序旋轉陣列中找到最小值 有序陣列arr可能經過一次旋轉處理,也可能沒有,且arr可能存在重複的數。例如,有序陣列 1,2,3,4,5,6,7 可以旋轉處理成 4,5,6,7,1,2,3 等。給定乙個可能旋轉過的有序陣列arr,返回arr中的最小值。要求 期望複雜度為o log n o log n...