如题
找数的最直接想法就是,排序二分两板斧了,直接有序,那就上二分大法,有翻转很显然会有特殊情况的处理
public static int search(int[] nums, int target) {
if ((nums[0] > nums[nums.length - 1] && target < nums[0] && target > nums[nums.length - 1]) || //在范围外的直接排除
(nums[0] < nums[nums.length - 1] && (target < nums[0] || target > nums[nums.length - 1]))) {
return -1;
} else if (nums[0] == target) {
return 0;
} else if (nums[nums.length - 1] == target) {
return nums.length - 1;
}
int left = 0;
int right = nums.length - 1;
int middle = 0;
while (right > left + 1) {
middle = (left + right) / 2;
if (nums[middle] > target) {
if (nums[right] < nums[left] && target < nums[0] && nums[middle] > nums[0]) {//特殊情况 456123 target 1 middle上为6
//首先判断 left-》right范围内上有翻转 //后续判断middle与target位于哪半段
left = middle;
} else {//其他为标准的二分查找
right = middle;
}
} else if (nums[middle] < target) {
if (nums[right] < nums[left] && target > nums[0] && nums[middle] < nums[0]) {//特殊情况 45123 target 5 middle上为1
//同样是先判断有翻转 //后续分别判断middle与target位于哪段
right = middle;
} else {//同样是标准的二分查找
left = middle;
}
} else {
return middle;
}
}
return -1;
}
主要在一个特殊情况的归纳,其他都可以走通用逻辑