题目链接
思路:
由于所给数组可能包含重复元素,那么就需要跳过重复元素,避免重复性搜索。
使用二分法进行搜索查找。
利用旋转数组的特性:从中间某个位置切分后,左边升序排列,右边升序排列,且数组第一个值大于等于数组最后一个值
利用二分法来确定搜索区间,之后在此区间内进行查找
public boolean search(int[] nums, int target) {
// 数组中不可能存在目标值的情况
if (nums == null || nums.length == 0 ||
(target < nums[0] && target > nums[nums.length - 1])) {
return false;
}
int left = 0;
int right = nums.length - 1;
while (left <= right) {
// 出现重复元素时,跳过
while (left < right && nums[left] == nums[left + 1]) {
left++;
}
while (left < right && nums[right] == nums[right - 1]) {
right--;
}
int mid = (left + right) / 2;
// 找到目标值,返回
if (nums[mid] == target) {
return true;
}
// 若此时的值大于等于左指针所指向的值,那么此时目标值只可能存在于左边区间内
if (nums[mid] >= nums[left]) {
// 目标值小于此时的值且大于等于左指针所指向的值时
// 目标值可能存在于[left,mid - 1]中,此区间中进行二分查找
if (target < nums[mid] && target >= nums[left]) {
right = mid - 1;
} else { // 目标值可能存在于[mid + 1, right]中
left = mid + 1;
}
} else { // 目标值可能存在于右边区间内
if (target > nums[mid] && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return false;
}