方法1.例如4,5,6,7,0,1,2
首先取中间值,取完中间值之后左右总有一边的是升序的排列,判断target的值是否在这个序列里面,
如果在,直接在这个序列里做二分查找,如果不在,则继续在另外的序列做上诉的判断。
时间复杂度:O(logn).
注意:主要是要时刻注意临界值,什么时候跳出循环要把握好,否则可能陷入死循环。
这道题主要是考验了对二分查找的运用。
class Solution {
public int search(int[] nums, int target) {
int mid;
int start=0,end=nums.length-1;
int count=-1;
while(start<=end){
mid=(start+end)/2;
if(target==nums[mid]){
count=mid;
break;
}
if(nums[start]<=nums[mid]){
if(target>=nums[start]&&target<=nums[mid]){
end=mid-1;
}
else{
start=mid+1;
}
}else{
if(target>=nums[mid]&&target<=nums[end]){
start=mid+1;
}else{
end=mid-1;
}
}
}
return count;
}
}
方法2:先用二分法找到最小值的坐标,然后再进行二分。
class Solution {
public int search(int[] nums, int target) {
int start=0,end=nums.length-1;
int mid;
//先找到最小的值的坐标
while(start<end){
mid=(start+end)/2;
if(nums[mid]>nums[end]){
start=mid+1;
}else{
end=mid;
}
}
int min=end;
// System.out.println(min);
if(nums.length==0){
return -1;
}
if(target>=nums[0]&&min>0&&target<=nums[min-1]){
return binaryFind(0,min-1,nums,target);
}
if(target>=nums[min]&&target<=nums[nums.length-1]){
return binaryFind(min,nums.length-1,nums,target);
}
return -1;
}
public int binaryFind(int start,int end,int[] nums,int target){
int mid;
while(start<=end){
mid=start+(end-start)/2;
if(nums[mid]==target){
return mid;
}
if(target>nums[mid]){
start=mid+1;
}else{
end=mid-1;
}
}
return -1;
}
}