这道题要在一个已经被旋转后的数组当中找到目标数值target;
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
首先需要考虑排序数组旋转后有什么特征.那就肯定有一处地方是乱序的。 我们正常在数组当中查一个数都是用的二叉搜索, 所以 我们可以先将数组拆成两块, 所以一块是正序, 一块是乱序。 我们基于正序的那部分进行条件判断和做逻辑修改就可以了, 这样我们就完全没有受到旋转的影响
public int search(int[] nums, int target) {
int lo = 0;
int hi = nums.length - 1;
while(lo <= hi) {
int mid = (lo + hi) /2;
if(nums[mid] == target) {
return mid;
}
if(nums[mid] >= nums[lo] ) {
if(target < nums[lo] || target > nums[mid]) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
if(nums[mid] <= nums[hi]) {
if(target < nums[mid] || target > nums[hi]) {
hi = mid - 1;
} else {
lo = mid + 1;
}
}
}
return -1;
}