题目
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。
示例1 : 输入: nums = [2,5,6,0,0,1,2], target = 0 输出: true
示例 2: 输入: nums = [2,5,6,0,0,1,2], target = 3 输出: false
注意点
参考:搜索旋转排序数组(二分法实现) 1、有序数组经过旋转后会变为部分有序的数组; 2、我们使用二分法后会出现三种情况如下:
情况一:无法判断左右区间哪个是有序区间,这种情况我们只能排除一个节点的元素,无法进行区间选择;(如101111这种情况,则当nums[left] == nums[mid] == nums[right时])情况二:左区间为有序区间,则判断目标节点是否在有序区间中(左区间),在,则选取左区间;否则,选取右区间;情况二:右区间为有序区间,则判断目标节点是否在有序区间中(右区间),在,则选取右区间;否则,选取左区间。
实现
public boolean search(int[] nums
, int target
) {
if (nums
== null
|| nums
.length
== 0) return false;
int left
= 0;
int right
= nums
.length
- 1;
while (left
<= right
){
int mid
= left
+ (right
- left
) / 2;
if (nums
[mid
] == target
) return true;
if (nums
[left
] == nums
[mid
]){
left
++;
}else if (nums
[left
] < nums
[mid
]){
if (target
>= nums
[left
] && target
< nums
[mid
]){
right
= mid
- 1;
}else {
left
= mid
+ 1;
}
}else {
if(target
> nums
[mid
] && target
<= nums
[right
]){
left
= mid
+ 1;
}else {
right
= mid
- 1;
}
}
}
return false;
}