1. 题目
2. 分析
- mid 等于target的时候,直接返回
- mid 小于target的时候
- mid 大于target的时候
3. 代码
class Solution {
public static int search(int[] nums, int target) {
int l = 0, r = nums.length - 1, mid;
while (l <= r) {
mid = (l + r) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
if (nums[0] >= nums[nums.length - 1] && nums[mid] >= nums[0] && target <= nums[nums.length - 1]) {
l = mid + 1;
continue;
}
r = mid - 1;
} else {
if (nums[0] >= nums[nums.length - 1] && target >= nums[0] && nums[mid] <= nums[nums.length - 1]) {
r = mid - 1;
continue;
}
l = mid + 1;
}
}
return -1;
}
}
4. 总结
本题卡最久的时候是确认红色框内的条件,最开始没有想清楚什么条件,先尝试了mid 和 target 与各自边界比较,不行,后面又加上了最左边和最右边的比较才行。最终其实就是在以下条件:要特殊处理:有序数组被分成了两片且mid和target各自在分开的两片上。