题目
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。
编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。
输入: nums = [2,5,6,0,0,1,2], target = 0
输出: true
输入: nums = [2,5,6,0,0,1,2], target = 3
输出: false
思路
相似题
此题与33相似,唯一区别是会存在重复元素。当边界值重复相等时,无法判断是否是有序的,此时左边界移动一步,相当于去掉重复值。其余都相等
代码
public boolean search(int[] nums, int target) {
if(nums==null){
return false;
}
int left = 0;
int right = nums.length-1;
int mid;
while(left<=right){
mid = left + (right - left) / 2;
if(target==nums[mid]){
return true;
}
//此题会存在重复元素,如果存在边界重复,那么久左指针移动一步。
if(nums[left]==nums[mid]){
left++;
continue;
}
if(nums[left]<=nums[mid]){
if(target<nums[mid]&&target>=nums[left]){
right = mid-1;
}
else{
left = mid+1;
}
}else{
if(target>nums[mid]&&target<=nums[right]){
left = mid+1;
}
else{
right = mid-1;
}
}
}
return false;
}