描述
给定一个非降序的数组 a a\ a ,对第 i i\ i 位之后的部分进行旋转(将 ai+1a_{i+1}ai+1 及以后的部分按原数组顺序移到前面),即 a a\ a 中的元素满足 a0≤a1≤ai,ai+1≤ai+1≤ana_0 \leq a _1 \leq a_i , a_{i+1} \leq a _{i+1} \leq a_na0≤a1≤ai,ai+1≤ai+1≤an。
例如,对于数组 a=[1,3,4,4,5] a=[1,3,4,4,5]\ a=[1,3,4,4,5] ,取 i=2 i=2\ i=2 进行旋转,那么得到的数组是 a=[4,4,5,1,2] a=[4,4,5,1,2]\ a=[4,4,5,1,2]
特殊的 , 若 i=n i=n\ i=n ,则原数组不发生任何改变。
现在给定一个数 x x\ x ,请你在数组 a a\ a 中搜索 x x\ x 是否存在。若存在则返回 true ,否则返回 false 。
要求空间复杂度 O(1) O(1)\ O(1) ,时间复杂度 O(logn) O(logn)\ O(logn)
示例1
输入:
[1],1
返回值:
true
public boolean search(int[] A, int target) {
if(A==null || A.length==0)
return false;
int l = 0;
int r = A.length-1;
while(l<=r)
{
int m = (l+r)/2;
if(A[m]==target)
return true;
if(A[m]>A[l])
{
if(A[m]>target && A[l]<=target)
{
r = m-1;
}
else
{
l = m+1;
}
}
else if(A[m]<A[l])
{
if(A[m]<target && A[r]>=target)
{
l = m+1;
}
else
{
r = m-1;
}
}
else
{
l++;
}
}
return false;
}