Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
在旋转有序数组中搜索指定值:(不允许额外空间,尽量最小时间复杂度)
这里只讨论最优解法:二分法,时间复杂度O(N)
博主也是看了别人的解法才有的想法。
首先应该清楚在旋转数组中存在两个有序的部分,因为二分法要求每次循环操作元素减半,也就是我们要确定mid元素,和两段有序部分边界的位置关系,,简单的说,你需要确定mid的左边是有序的还是mid的右边是有序的(且至少有一边是有序的,因为只存在一个边界)这样每次循环都可以确定元素在mid的哪一边(如果左边有序,很容易确定元素是否在左,进而算出元素位置)此算法时间复杂度为O(N)
代码:
public int search(int[] nums, int target) {
int left = 0,right = nums.length - 1;
while(left <= right){
int mid = (left + right) / 2;
if(target == nums[mid]) return mid;
else if(nums[mid] >= nums[left]){
if(target >= nums[left] && target < nums[mid]){
right = mid - 1;
}else{
left = mid + 1;
}
}else{
if(target <= nums[right] && target > nums[mid]){
left = mid + 1;
}else{
right = mid - 1;
}
}
}
return -1;
}