1.题目描述
2.思路
输入:旋转后的数组 nums,和一个整数 target
输出:target 在 nums 中的下标,如果不存在,返回 -1
限制:时间复杂度为 O(log n),所以不能用遍历,必须使用 二分查找!
二分查找:搜索区间必须是“单调有序”的(即 单调递增 或 单调递减)。
(1)首先翻转后的数组,构成两个有序数组。
(2)对第一个有序数组进行二分查找
(3)对第二个有序数组进行二分查找
3.代码实现
public class H33 {
public int search(int[] nums, int target) {
int left=0;
int right=nums.length-1;
//对于空数组直接返回-1
if(nums==null||nums.length==0)
{
return -1;
}
while(left<=right)
{
int mid=left+(right-left)/2;
//1.直接找到目标返回
if(nums[mid]==target)
{
return mid;
}
// 2. 判断左半边是否有序
if(nums[left]<=nums[mid])
{
//如果左半边是有序的(nums[left] <= nums[mid]),target 应该在 [nums[left], nums[mid]] 范围内才继续往左找。
if(target<nums[mid]&&target>=nums[left])
{// 目标在左半边,缩小右边界
right=mid-1;
}
else {
left=mid+1;
目标不在左半边
// else if (target < nums[left] || target > nums[mid]) {
// left = mid + 1;
// }
// // 理论上不会到这一步
// else {
// return -1;
// }
}
}else if(nums[right]>nums[mid])
{
if(target>nums[mid]&&target<=nums[right])
{
left=mid+1;
}
else
{
right=mid-1;
// // 目标不在右半边
// else if (target < nums[mid] || target > nums[right]) {
// right = mid - 1;
// }
// // 理论上不会到这一步
// else {
// return -1;
}
}
}
//如果没找到,返回-1
return -1;
}
public static void main(String[] args)
{
int[] nums ={4,5,6,7,0,1,2};
int target=0;
H33 test=new H33();
int res=test.search(nums,target);
System.out.print(res);
}
}