题目
示例 1:
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4
示例 2:
输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1
示例 3:
输入:nums = [1], target = 0
输出:-1
思路
这道题可以用二分来解决,但是难点是找到一段升序的数组。
首先根据中点的值与左右边界的值,进行比较。该中点的值必定小于其中一个,也必定大于其中一个。因为数组中的元素是按照升序排列的。所以就分两种情况:
1.中点大于左边界。
此时left-mid是有序的。此时来判断target是否大于左边界,并且小于右边界。如果成立则表明target在该范围内。则right = mid-1;
否则就是target不在该范围内,left = mid+1。
2.中点小于左边界,也就是中点小于右边界。
此时mid-right是有序的,判断target是否在该范围内,如果在在left = mid+1;否则right = mid-1;
代码
class Solution {
public int search(int[] nums, int target) {
int right = nums.length-1;
int left = 0;
while(left <= right){
int mid = left+(right-left)/2;
if(nums[mid] == target){
return mid;
}
if(nums[left]<=nums[mid]){
if(nums[mid]>target && nums[left]<=target){
right = mid-1;
}else{
left = mid+1;
}
}else{
if(target > nums[mid] && target <= nums[right]){
left = mid+1;
}else{
right = mid-1;
}
}
}
return -1;
}
}