力扣中等 33.搜索旋转排序数组
文章目录
- 题目介绍
- 题解
题目介绍
题解
首先用 153. 寻找旋转排序数组中的最小值 的方法,找到 nums 的最小值的下标 i。
然后分类讨论:
-
如果 target>nums[n−1],在 [0,i−1] 中二分查找 target。
-
如果 target≤nums[n−1],那么:
-
如果 i=0,说明 nums 是递增的,直接在 [0,n−1] 中二分查找 target。
-
如果 i>0,那么 target 一定在第二段 [i,n−1] 中,在 [i,n−1] 中二分查找 target。
这两种情况可以合并成:在 [i,n−1] 中二分查找 target。
-
class Solution {
public int search(int[] nums, int target) {
int n = nums.length, i = findMin(nums);
if (target > nums[n - 1]) { // target 在第一段
return lowerBound(nums, 0, i - 1, target);
}
// target 在第二段
return lowerBound(nums, i, n - 1, target);
}
// 153. 寻找旋转排序数组中的最小值
private int findMin(int[] nums) {
int left = 0, right = nums.length - 2; // 闭区间 [0, nums.length - 2]
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < nums[nums.length - 1]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return left;
}
// 有序数组中找 target 的下标
private int lowerBound(int[] nums, int left, int right, int target) {
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target){
return mid;
}else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
}```