我们知道,对于有序数组,可以使用二分查找
而这个经过旋转排序的,前后是部分有序的,
我们可以先判断首个元素和target的关系
来确定target是在数组的前后哪个部分
class Solution {
public int search(int[] nums, int target) {
int st = 0;
int ed = nums.length - 1;
if (target >= nums[0]) {
while(st<=ed) {
int mid = (st + ed) / 2;
if(nums[mid] == target) {
return mid;
}
if(nums[mid] < nums[0] || target < nums[mid]) {
ed = mid - 1;
} else {
st = mid + 1;
}
}
} else {
while(st<=ed) {
int mid = (st + ed) / 2;
if(nums[mid] == target) {
return mid;
}
if(nums[mid] >= nums[0] || target > nums[mid]) {
st = mid + 1;
} else {
ed = mid - 1;
}
}
}
return -1;
}
}
2021/8/21 重写
class Solution {
public int search(int[] nums, int target) {
int len = nums.length;
int ans = 0;
// 二分找出转折点
int flag = len;
int l = 1;
int r = len - 1;
int mid = 0;
while (l <= r) {
mid = (l + r) >> 1;
if (nums[mid] < nums[mid - 1]) {
flag = mid;
break;
} else if (nums[mid] > nums[0]) {
l = mid + 1;
} else {
r = mid - 1;
}
}
// 二分找出值
if (target >= nums[0]) {
ans = Arrays.binarySearch(nums, 0, flag, target);
} else {
ans = Arrays.binarySearch(nums, flag, len, target);
}
return ans >= 0 ? ans : -1;
}
}

这篇博客讨论了如何在已知旋转排序数组中高效地进行二分查找。作者首先介绍了问题背景,即部分有序的数组在旋转后可能造成的查找困难。然后,提供了两种不同的二分查找实现,分别针对不同情况优化了查找过程。第一种方法根据目标值与数组首元素的关系来确定查找范围,第二种方法则通过找到数组的转折点来缩小搜索区域。这两种方法都提高了在旋转排序数组中查找目标值的效率。
822

被折叠的 条评论
为什么被折叠?



