以中间位置分界,左右两边一定有一边是有序的,在有序的边界中搜索,如果没有则转到另一边搜索;无序的另一边使用同样的算法继续求解。
class Solution {
public:
int binSearch(vector<int> &v, int target, int l, int r) {
if (v.empty()) { return -1; }
int mid = l + (r - l) / 2;
if (v[mid] == target) { return mid; }
if (l >= r) return -1;
if (v[l] <= v[mid]) {
if (target >= v[l] && target < v[mid]) {
return binSearch(v, target, l, mid - 1);
}
else {
return binSearch(v, target, mid + 1, r);
}
}
else {
if (target > v[mid] && target <= v[r]) {
return binSearch(v, target, mid + 1, r);
}
else {
return binSearch(v, target, l, mid - 1);
}
}
}
int search(vector<int>& nums, int target) {
return binSearch(nums, target, 0, nums.size() -1);
}
};