搜索旋转数组。给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次了,次数不详。请编写代码找出数组中的某个元素,假设数组元素原先是按升序排列的。若有多个相同元素,返回索引值最小的一个。
示例1:
输入: arr = [15, 16, 19, 20, 25, 1, 3, 4, 5, 7, 10, 14], target = 5
输出: 8(元素5在该数组中的索引)
示例2:
输入:arr = [15, 16, 19, 20, 25, 1, 3, 4, 5, 7, 10, 14], target = 11
输出:-1 (没有找到)
提示:
arr 长度范围在[1, 1000000]之间
思路:两次二分,第一次找到数组最小值,第二次查找递增数组中是否存在target。
class Solution {
public int search(int[] arr, int target) {
int n = arr.length;
while (n > 1 && arr[n - 1] == arr[0]) n--;
int l = 0, r = n - 1;
while (l < r) {
int mid = (l + r) / 2;
if (arr[mid] <= arr[r]) r = mid;
else
l = mid + 1;
}
r = l + n - 1;
if (target < arr[l]) return -1;
while (l < r) {
int mid = (l + r) / 2;
if (arr[mid % n] >= target) r = mid;
else l = mid + 1;
}
if (arr[l % n] == target) return l % n;
return -1;
}
}