已知存在一个按非降序排列的整数数组
nums
,数组中的值不必互不相同。在传递给函数之前,
nums
在预先未知的某个下标k
(0 <= k < nums.length
)上进行了 旋转 ,使数组变为[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]
(下标 从 0 开始 计数)。例如,[0,1,2,4,4,4,5,6,6,7]
在下标5
处经旋转后可能变为[4,5,6,6,7,0,1,2,4,4]
。给你 旋转后 的数组
nums
和一个整数target
,请你编写一个函数来判断给定的目标值是否存在于数组中。如果nums
中存在这个目标值target
,则返回true
,否则返回false
。你必须尽可能减少整个操作步骤。
class Solution {
public boolean search(int[] nums, int target) {
if(nums.length == 0){
return false;
}
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == target){
return true;
}
if(nums[left] == nums[mid] && nums[right] == nums[mid]){
left++;
right--;
}
//左半边有序,在左半边使用二分查找
else if(nums[mid] >= nums[left]){
if(nums[left] <= target && target < nums[mid]){ //target处于[0,mid),向左移动mid
right = mid - 1;
}
else{
left = mid + 1;
}
}
//右半边有序,在右半边使用二分查找
else{
if(nums[mid] < target && target <= nums[nums.length - 1]){
left = mid + 1;
}
else{
right = mid - 1;
}
}
}
return false;
}
}