1. 题目
2. 思路和题解
这道题和力扣的33题很相似,解法还是差不多的。分为如下几个步骤:
- 直接判断nums[mid] == target
- 当数组为[3,4,3,3,3]时,有nums[mid] == nums[left] == nums[right],这个时候就需要 left++, right --;
- 当 nums[left] < nums[mid],说明是在左半边的递增区域,这个时候就要继续分两种情况,如果target在left和right中间,那么就令right= mid - 1,否则就令left = mid + 1
- 当 nums[mid] < nums[right],说明是在右半边的递增区域, 这个时候同样也要继续分两种情况,如果target在left和right中间,那么就令left = mid + 1,否则就令right= mid - 1
题目还是比较绕的,需要仔细地理清思路,进行理解。
完整代码如下:
class Solution {
public boolean search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
// 等于目标值
if (nums[mid] == target) {
return true;
}
// 无法确定有序部分时,移动左右指针
if (nums[mid] == nums[left] && nums[mid] == nums[right]) {
left++;
right--;
}
// 在前部分有序
else if (nums[left] <= nums[mid]) {
if (nums[left] <= target && target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
// 在后部分有序
else {
if (nums[mid] < target && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return false;
}
}