已知存在一个按非降序排列的整数数组
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;
}
}




















