题目
题解
直接查找是很简单的,时间复杂度 O ( n ) O(n) O(n),关键是如何用 O ( l o g n ) O(logn) O(logn)的时间实现?
很自然的想法就是二分法,但是二分法的条件是数组有序,然而现在给的是一个旋转后的数组,即无序数组,该怎么利用二分法呢?
将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。
此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环.
class Solution {
public int search(int[] nums, int target) {
int low=0,high=nums.length-1;
while(low<=high){
int mid=(low+high)/2;
if(target==nums[mid])
return mid;
//前半部分有序
if(nums[low]<=nums[mid]){
//target在有序的前半部分,对前半部分二分
if(target>=nums[low]&&target<=nums[mid])
high=mid-1;
//target在后半部分,继续对后半部分二分
else
low=mid+1;
}
//前半部分无序,则后半部分有序
else{
//target在有序的后半部分
if(target>=nums[mid]&&target<=nums[high])
low=mid+1;
else
high=mid-1;
}
}
return -1;
}
}
时间复杂度:
O
(
l
o
g
n
)
O(logn)
O(logn)
空间复杂度:
O
(
1
)
O(1)
O(1)