题目描述:
题目分析:
这道题目中要求的时间复杂度,反而是一种提示,看到这个时间复杂度自然会想到使用二分查找。唯一的问题是这个数组有别于一般的有序数组,那么该如何合理使用二分查找呢?我这里使用的方式是根据特点,将一个数组分成前后两个分数组,然后根据这两个分数组分别进行二分查找即可。
代码:
public class Search {
public static void main(String[] args) {
int[] nums = {4,5,6,7,0,1,2};
System.out.println(search(nums,0));
}
public static int search(int[] nums, int target) {
int index = -1;
int count = 0; //用来记录前半部分有序的元素个数
int len = nums.length;
for (int i = 1; i < len; i++) {
count++;
if (nums[i]<nums[i-1]){
break;
}
}
int[] front = new int[count]; //储存前有序部分的数组
int[] rear = new int[len-count]; //存储后有序部分的数组
for (int i = 0; i < count; i++) {
front[i] = nums[i];
}
for (int i = count; i < len; i++) {
rear[i-count] = nums[i];
}
if (quickSearch(front,target)!=-1){
index = quickSearch(front,target);
}
if (quickSearch(rear,target)!=-1){
index = quickSearch(rear,target)+count;
}
return index;
}
public static int quickSearch(int[] nums,int target){
int begin = 0;
int end = nums.length-1;
while (begin<=end){
int mid = begin+(end-begin)/2;
if (nums[mid]<target){
begin = mid+1;
}else if (nums[mid]>target){
end = mid-1;
}else {
return mid;
}
}
return -1;
}
}