在有序旋轉陣列中找到最小值

2021-10-12 08:41:32 字數 1786 閱讀 4223

在有序旋轉陣列中找到最小值

有序陣列arr可能經過一次旋轉處理,也可能沒有,且arr可能存在重複的數。例如,有序陣列[1, 2, 3, 4, 5, 6, 7],可以旋轉處理成[4, 5, 6, 7, 1, 2, 3]等。給定乙個可能旋轉過的有序陣列arr,返回arr中的最小值。

[要求]

期望複雜度為o

(log⁡n

)o(\log n)

o(logn)

輸入描述:

第一行乙個整數n表示陣列大小。

接下來n個數表示陣列內的數。

輸出描述:

輸出乙個整數表示答案

示例1輸入

7

1 2 3 4 5 6 7

輸出
1
示例2

輸入

7

4 5 6 7 1 2 3

輸出
1
備註:

1 ⩽n

⩽106

1 \leqslant n \leqslant 10^6

1⩽n⩽1061⩽

arri

⩽109

1 \leqslant arr_i \leqslant 10^9

1⩽arri

​⩽10

9題解:

二分。注意:二分不一定必須要有單調性,二分的本質是尋找某種性質的分界點。只要找到某種性質,可以確定目標在區間的前半部分還是後半部分,就可以用二分找到這個分界點。

為了便於分析,將陣列中的元素畫在二維座標系中,橫軸代表下標,縱軸代表值。

水平的實線表示相同的元素。可以發現,除了黑色水平那段,其餘部分均滿足二分性質:豎直的虛線左邊的元素均滿足arr

[i]>=a

rr[0

]arr[i]>=arr[0]

arr[i]

>=a

rr[0

],而虛線右邊(去除黑色線段部分)的元素均滿足arr[i]

r[0]

arr[i]ar

r[i]

r[0]

。首先,我們需要把黑色的水平段刪除,至於為什麼刪除呢?考慮一種情況:arr

[mid

]==a

[0]arr[mid] == a[0]

arr[mi

d]==

a[0]

,這種情況下,根本不知道往哪邊走,所以只能刪除。

還需要處理陣列未旋轉的情況。當刪除黑色水平段後,若剩下的最後乙個元素大於等於arr[0],說明陣列完全單調。但最壞情況:元素均相等情況下的時間複雜度為o(n

)o(n)

o(n)

。剩下的就是普通二分了:

**:

#include
using

namespace std;

const

int n =

1000000

;int n;

int a[n]

;int

main

(void

)return0*

printf

("%d\n"

, a[l]);

}

在有序旋轉陣列中找到最小值

題目 有序陣列arr可能經過一次旋轉處理,也可能沒有,且arr可能存在重複的數。例如,有序陣列 1,2,3,4,5,6,7 可以旋轉處理成 4,5,6,7,1,2,3 等。給定乙個可能旋轉過的有序陣列arr,返回arr中的最小值。基本思路 盡可能的利用二分查詢,但是最壞情況仍然無法避免o n 的時間...

在有序旋轉陣列中查詢最小值

有序陣列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中的最小值。根據題目分析 有序指公升序 旋轉處理將公升序陣列分成前後兩部分,進行整...