题目
示例
解法1:二分法
思路作者:
思路:如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的,我们只要在有序的半段里用首尾两个数组来判断目标值是否在这一区域内,这样就可以确定保留哪半边了
我的代码
class Solution {
public int search(int[] nums, int target) {
if (nums.length<1)return -1;
if (nums.length==1){
if (nums[0]==target)return 0;
else return -1;
}
int left = 0;
int right = nums.length-1;
while (left<right){
int mid = (left + right)/2;
if (nums[mid] == target)return mid;
if (nums[right] == target)return right;
if (nums[left] == target)return left;
if (nums[mid]<nums[right]){//右边有序
if (target<nums[right] && target>nums[mid]){//如果target在有序的这边
left = mid+1;
}else {//说明在无序的那边
right = mid;
}
}else {//左边有序
if (target<nums[mid] && target>nums[left]){//如果target在有序的这边
right = mid;
}else {//说明在无序的那边
left = mid+1;
}
}
}
return -1;
}
}
人家的代码
class Solution {
public int search(int[] nums, int target) {
int len = nums.length;
int left = 0, right = len-1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < nums[right]){
if(nums[mid] < target && target <= nums[right])
left = mid+1;
else
right = mid-1;
}
else{
if(nums[left] <= target && target < nums[mid])
right = mid-1;
else
left = mid+1;
}
}
return -1;
}
}
效果