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