8 3 魔術索引

2021-10-05 12:00:32 字數 1557 閱讀 4383

rra

y[mi

d]

array[mid]

array[

mid]

小於中間值索引mid

midmi

d時中間值左邊的元素的最大值為mid

−2

mid-2

mid−

2且元素值單調遞減,中間值左邊的元素的索引值從mid

−1

mid-1

mid−

1以1位單位單調遞減,因此在左邊不可能出現魔術索引。此時遞迴搜尋右邊。當中間值arr

ay[m

id

]array[mid]

array[

mid]

大於中間值索引mid

midmi

d時中間值右邊的元素的最小值為mid

+2

mid+2

mid+

2且元素值單調遞增,中間值右邊的元素的索引值從mid

+1

mid+1

mid+

1以1位單位單調遞增,因此在右邊不可能出現魔術索引。此時遞迴搜尋左邊。如果中間值等於中間索引則返回,這裡只要求求乙個魔術索引,但是其實陣列中也可以有多個魔術索引。

改進演算法考慮了陣列中有相同元素值的情況,這時就無法排除某一邊而是要兩邊同時搜尋,但是可以減少搜尋的範圍。

//假設陣列中各個元素的值不同(普通演算法)

intmagicfast

(vector<

int>

&array,

int start,

int end)

else

if(array[mid]

> mid)

else

}int

magicfast

(vector<

int> array)

//這裡考慮了陣列中有相同元素值的情況(改進演算法)

intmax

(int a,

int b)

intmin

(int a,

int b)

intmagicfast

(vector<

int>

&array,

int start,

int end)

int leftindex =

min(midindex-

1,midvalue)

;int left=

magicfast

(array, start, leftindex);if

(left>=0)

int rightindex =

max(midindex +

1, midvalue)

;int right =

magicfast

(array, rightindex, end)

;return right;

}int

magicfast

(vector<

int> array)

C 魔術索引

includeusing namespace std include 題目描述 在陣列a 0.n 1 中,有所謂的魔術索引,滿足條件a i i。給定乙個公升序陣列,元素值各不相同,編寫乙個方法,判斷在陣列a中是否存在魔術索引。請思考一種複雜度優於o n 的方法。給定乙個int陣列a和int n代表陣...

C 魔術索引2

includeusing namespace std include 在陣列a 0.n 1 中,有所謂的魔術索引,滿足條件a i i。給定乙個不下降序列,元素值可能相同,編寫乙個方法,判斷在陣列a中是否存在魔術索引。請思考一種複雜度優於o n 的方法。給定乙個int陣列a和int n代表陣列大小,請...

面試題 08 03 魔術索引

難度 簡單 題目描述 解題思路 如果不想複雜的話就很簡單嘛 看起來也不太像是二分的樣子啊 public intfindmagicindex int nums public intfindhelper int nums,int left,int right int mid left right lef...