int bin_search(vector<int>::size_type l_idx, vector<int>::size_type r_idx, vector<int>& arr){
int pivot = arr[0]; // (1)
if(l_idx == r_idx){
return min(arr[l_idx], pivot); // (2)
}
vector<int>::size_type mid_idx = (l_idx + r_idx) / 2;
if(arr[mid_idx] < pivot){
return bin_search(l_idx, mid_idx, arr); // (3)
}
else if(arr[mid_idx] > pivot){
return bin_search(mid_idx+1, r_idx, arr); // (4)
}
else{
return min(bin_search(l_idx, mid_idx, arr), bin_search(mid_idx+1, r_idx, arr)); // (5)
}
}
(1)将最左边的值单独拿出来作为后面向左搜索还是向右搜索的依据
(2)如果l_idx == r_idx,说明搜索到尽头,返回这个值和pivot中小的那个,防止[1,2,3,4,5]这种未旋转的情况
(3)分类讨论,如果中间值小于pivot,说明落在旋转后的右边区域,右边不用再搜索了
(4)如果中间值大于pivot,说明落在旋转后的左边区域,左边不用再搜索了
(5)相等左右都搜索防止[4,3]只有两个值的这种情况

京公网安备 11010502036488号