这个题上来就遍历一遍找到的话,明显配不上它中等的身份。所以一定有复杂度更低的算法。
这个题目就是二分,关键是怎么寻找目标位置。如果在left位置等于目标值,我们就直接返回这个位置,之所以这样是因为题目中有重复值,我们需要找最小位置的目标值。然后如果mid这个位置的值等于目标值,我们把right等于mid,让它再往前查找是否还有合适的满足目标的值。否则的话我们就看目标值是在前部半分还是在后半部分,如果前半部分是arr[mid]大于arr[0]的,那么说明一定有小于arr[mid]并大于arr[0]的数字,下一步就看target值在不在他俩中间,如果在的话,就去左半部分查找,不在的话,就去右半部分。如果前半部分是arr[mid]小于arr[0]的,那看target在不在后半部分,如果在就在后半部分查找,否则就去前半部分。如果出现mid和arr[0]位置值相同的话而且还不是我们寻找的目标位置,我们就left+1,把最前的位置去除掉。
class Solution {
public int search(int[] arr, int target) {
int len= arr.length;
int left=0,right=len-1;
while(left<=right)
{
int mid=(left+right)/2;
if(arr[left]==target){
return left;
}
if(arr[mid]==target)
{
right=mid;
}
else if(arr[mid]>arr[0])
{
if(arr[mid]>target&&target>=arr[0])
right=mid-1;
else
left=mid+1;
}
else if(arr[mid]<arr[0])
{
if(arr[mid]<target&&target<=arr[len-1])
left=mid+1;
else
right=mid-1;
}
else
left+=1;
}
return -1;
}
}