题目:
给你⼀个整数数组 nums ,和⼀个整数 target 。该数组按照升序排序但是在预先未知的某个点上进⾏了旋转请你在数组中搜索 target ,如果数组中存在这个⽬标值,则返回它的索引,否则返回 -1 。
示例 :输⼊: nums = [4,5,6,7,0,1,2], target = 0输出: 4
要点——学会从简单的地方突破
既然是排序数组,查找肯定是用二分法的
关键在于判断有序部分是mid的左侧还是右侧,然后只需要⽐较 target 和有序部分的边界即可确定下一步进入左侧or右侧
// 搜索旋转排序数组——也可以用循环while(l<=r),就不用递归了
function searchRotateArray(arr, target, l = 0, r = arr.length - 1) {
// 找不到
if (l > r) return -1;
const mid = (l + r) >> 1;
// 特殊情况快速结束
if (arr[mid] === target) {
return mid;
} else if (arr[l] === target) {
return l;
} else if (arr[mid] >= arr[l]) {
// 左侧是有序部分
if (arr[mid] > target && arr[l] < target) {
return searchRotateArray(arr, target, l, mid - 1);
} else {
return searchRotateArray(arr, target, mid + 1, r);
}
} else {
// 右侧是有序部分
if (arr[mid] < target && arr[l] > target) {
return searchRotateArray(arr, target, mid + 1, r);
} else {
return searchRotateArray(arr, target, l, mid - 1);
}
}
}