从类似45678123这样的有序数组中寻找对应的target,思路是还是按照普通的二分查找,然后再求出中间值mid后将其转换对应到数组中的index,然后进行比较或者返回。
public int search(int[] A, int target) {
if(A.length==0)return -1;
if(A.length==1){
if(A[0]==target)return 0;
else return -1;
}
int qian=1;
for(int i=0;i<A.length-1;i++){
if(A[i]>A[i+1])break;
qian=i+2;
}
int hou=A.length-qian;
int i=0,j=A.length-1,chan;
while(i<=j){
int mid=(i+j)/2;
if(mid<hou)chan=mid+qian;
else chan = mid-hou;
//if(hou==0)chan=mid;
if(A[chan]==target)return chan;
if(A[chan]>target) j=mid-1;
else i=mid+1;
}
return -1;
}
第二题在第一题的基础上添加了数组中可能有重复元素,问是否影响复杂度,我觉得会降低复杂度,因为对于相同长度的数组,如果有重复数,相应的二分的命中几率就会大,次数就会少。
public boolean search(int[] A, int target) {
if(A.length==0)return false;
if(A.length==1){
if(A[0]==target)return true;
else return false;
}
int qian=1;
for(int i=0;i<A.length-1;i++){
if(A[i]>A[i+1])break;
qian=i+2;
}
int hou=A.length-qian;
int i=0,j=A.length-1,chan;
while(i<=j){
int mid=(i+j)/2;
if(mid<hou)chan=mid+qian;
else chan = mid-hou;
//if(hou==0)chan=mid;
if(A[chan]==target)return true;
if(A[chan]>target) j=mid-1;
else i=mid+1;
}
return false;
}
Update 2015/08/23:下面是新的代码,注意数组判断长度是否为0和判断对象是否为空一样重要。
public class Solution {
/**
*@param A : an integer rotated sorted array
*@param target : an integer to be searched
*return : an integer
*/
public int search(int[] A, int target) {
// write your code here
if(A.length==0)return -1;
int i=0,j=A.length-1;
int s = A[i];
int e = A[j];
while(i<=j){
int mid=(i+j)/2;
if (A[mid] == target)
return mid;
else if (A[mid] >= A[i]){
if (target >= A[i] && target < A[mid])
j = mid - 1;
else
i = mid + 1;
} else {
if (target <= A[j] && target > A[mid])
i = mid + 1;
else
j = mid - 1;
}
}
return -1;
}
}
public class Solution {
/**
* param A : an integer ratated sorted array and duplicates are allowed
* param target : an integer to be search
* return : a boolean
*/
public boolean search(int[] A, int target) {
// write your code here
if(A.length==0)return false;
int i=0,j=A.length-1;
int s = A[i];
int e = A[j];
while(i<=j){
int mid=(i+j)/2;
if (A[mid] == target)
return true;
else if (A[mid] > A[i]){
if (A[i] <= target && target < A[mid])
j = mid - 1;
else
i = mid + 1;
} else if (A[mid] < A[i]){
if (target <= A[j] && A[mid] < target)
i = mid + 1;
else
j = mid - 1;
} else
i++;
}
return false;
}
}