一、二分查找
1、查找无序数组中的任意一个局部最小值
局部最小值:
arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1]又有arr[i]<arr[i+1],那么arr[i]是局部最小。
解法:二分查找。先查看左右两边是不是局部最小。都不是则局部最小一定在中间,于是查看mid处是不是,若不是则局部最小要么在其左边要么在其右边,判断出在左边还是在右边,继续二分查找即可。
class
Solution {
public
:
int
getLessIndex(vector<
int
> arr) {
int
length = arr.size();
if
(length ==
0
)
return
-
1
;
if
(length ==
1
)
return
0
;
if
(arr[
0
] < arr[
1
])
return
0
;
if
(arr[length-
1
] < arr[length-
2
])
return
length-
1
;
int
start =
0
,end = length-
1
;
int
mid = (start+end)/
2
;
while
(
1
) {
if
(arr[mid] < arr[mid+
1
] && arr[mid] < arr[mid-
1
])
return
mid;
else
if
(arr[mid] > arr[mid-
1
]) {
end = mid;
mid = (start+end)/
2
;
}
else
{
start = mid;
mid = (start+end)/
2
;
}