33. 搜索旋转排序数组
查看题目中等
数组
排序
高频
解法一:二分查找
时间复杂度:O(log n) | 空间复杂度:O(1) | 推荐使用
动画演示
准备就绪 - 点击开始按钮查看动画
代码实现
class Solution {
public int 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 mid;
}
// 如果mid左边有序
if (nums[left] <= nums[mid]) {
// target在左边的有序子数组中
if (nums[left] <= target && target < nums[mid]) {
right = mid - 1;
// target在右边
} else {
left = mid + 1;
}
// 否则右边有序
} else {
// target在右边的有序子数组中
if (nums[mid] < target && target <= nums[right]) {
left = mid + 1;
// target在左边
} else {
right = mid - 1;
}
}
}
return -1;
}
}时间复杂度:O(log n)
空间复杂度:O(1)
二分查找变种,处理旋转排序数组。通过判断哪一半是有序的,然后在有序半段中查找目标值。
核心思路:
1. 计算中间位置mid
2. 如果nums[mid]等于target,返回mid
3. 判断左半段是否有序(nums[left] <= nums[mid])
4. 如果左半段有序,检查target是否在左半段范围内
5. 如果target在左半段,调整right = mid - 1
6. 否则,调整left = mid + 1
7. 如果右半段有序,执行类似的判断
8. 重复上述步骤,直到找到目标或遍历完数组
该算法利用了旋转排序数组的特性,每次迭代都能将搜索范围减半,因此时间复杂度为O(log n),空间复杂度为O(1)。