📅  最后修改于: 2023-12-03 15:40:53.570000             🧑  作者: Mango
这个Java程序用于在旋转排序数组中搜索给定元素,它采用二分查找算法,时间复杂度为 O(log n)。
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] >= nums[left]) {
if (target >= nums[left] && target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else {
if (target > nums[mid] && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return -1;
}
该算法利用了二分查找算法的思想,但是需要在二分的过程中判断一些特殊情况。
首先设定左右指针,以及中间指针 mid = (left + right) / 2。如果中间指针所对应的元素是目标元素,则直接返回 mid。
接下来,我们需要判断 mid 所对应的元素处于旋转数组左半段还是右半段。我们可以比较 nums[mid] 和 nums[left] 的大小。如果 nums[mid] >= nums[left],那么 mid 落在了左半部分,否则 mid 落在了右半部分。
对于左半部分,我们比较 target 是否在 [left, mid) 区间内,如果是,那么将右指针 right 移动到 mid - 1,否则将左指针 left 移动到 mid + 1。
对于右半部分,我们比较 target 是否在 (mid, right] 区间内,如果是,那么将左指针 left 移动到 mid + 1,否则将右指针 right 移动到 mid - 1。
重复进行以上步骤,直到 left > right。
该算法是在旋转排序数组中查找元素的最佳算法之一,时间复杂度为 O(log n)。程序实现简单、易于理解,可以帮助开发者快速解决旋转排序数组查找的问题。