有序旋轉陣列最小值

2021-10-02 20:04:32 字數 2188 閱讀 7730

【題目】

有序陣列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

]print

(rotate_arr_minimum(arr)

)# 1

arr =[1

,1,1

,1,1

,1,1

]print

(rotate_arr_minimum(arr)

)# 1

arr =[1

,0,1

,1,1

,1,1

]print

(rotate_arr_minimum(arr)

)# 0

arr =[1

,1,1

,1,1

,0,1

]print

(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...