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