题目:
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.
Your algorithm's runtime complexity must be in the order of O(log n).
Example 1:
Input: nums = [4,5,6,7,0,1,2]
, target = 0
Output: 4
Example 2:
Input: nums = [4,5,6,7,0,1,2]
, target = 3
Output: -1
题意:
给定一个改变后的升序数组,它可能是有一定偏移的,例如[ 1,2,3,4,5]偏移两个后可以是[3,4,5,1,2]
需要在时间复杂度logn的情况下找到指定数,没有则返回-1
解法:
看复杂度logn的要求就可以猜到需要用 二分查找
而数组不是一个正常顺序的,又不能用排序(会超过复杂度)
这个时候要利用一个特点
将这样的数组从中间劈成两半 ,其中一定有一半是有序的,例如[4,5,6,7,0,1,2]
分成两半后分别为 [4,5,6,7] 和[7,0,1,2]
很明显左边有序 这个时候如果要找4到7之间的就可以在左边一半进行搜索
否则进入右边一半,再劈开,再判断,进行二分搜索。
代码:
class Solution {
public int search(int[] nums, int target) {
int start = 0;
int end = nums.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (target == nums[mid]) {
return mid;
}
if (nums[start] <= nums[mid]) {//左半段是有序的
if (target >= nums[start] && target < nums[mid]) {//target 在这段里
end = mid - 1;
} else {
start = mid + 1;
}
} else {//右半段是有序的
if (target > nums[mid] && target <= nums[end]) { //target在其中
start = mid + 1;
} else {
end = mid - 1;
}
}
}
return -1;
}
}