相关标签
一、题目要求
二、题解和代码实现
1.题解
2.代码实现
代码如下(示例):
class Solution {
public int search(int[] nums, int target) {
if(nums.length ==0){return -1;}
if (nums.length ==1){
return nums[0]==target? 0:-1;
}
int r = nums.length - 1;
int l = 0;
// 第一次「二分」:从中间开始找,找到满足 >=nums[0] 的分割点(旋转点)
while (l < r){
int mid = (l+r+1)/2;//+1防止无限循环
if (nums[mid] >=nums[0]){//找到分割点,也就是两个有序数组的分割点
l = mid;
}else {
r = mid-1;
}
}
// 第二次「二分」:通过和 nums[0] 进行比较,得知 target 是在旋转点的左边还是右边
if (nums[0] <= target){//当此成立,说明目标在左边,也就是有序数组元素大的那边(k,k+1,k+2)
l =0;
}else {//这成立,说明在右边,也就是另一个有序数组(0,1,2...,k-1),修改l和r的位置,把它移到右边有序数组
l =l+1;//
r = nums.length-1;
}
while (l < r){//第二次二分
int mid = (l+r)/2;
if (nums[mid] >= target){// 当此成立说明目标值在左边
r =mid;
}else {//否则 目标值在左边
l = mid+1;
}
}
return nums[r]==target? r:-1;//最后找到目标值输出
}
}