
先利用二分查找去找分界点,然后就可以分为2个有序区间,在某一个区间里再二分查找。
class Solution {
public:
int search(vector<int>& nums, int target) {
if (nums.empty())
return -1;
int point = findPartition(nums);
//如果没有分界点,则说明只有一段有序区间,直接普通二分查找
if (point == -1) return binarySearch(nums, 0, nums.size() - 1, target);
//分界点刚好是要找的点
else if (nums[point] == target) return point;
//要找的点在后半段
else if (target < nums[0]) return binarySearch(nums, point + 1, nums.size() - 1, target);
//要找的点在前半段
else return binarySearch(nums, 0, point + 1, target);
}
//二分查找分界点
int findPartition(vector<int>& nums) {
int left = 0, right = (int)nums.size() - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (mid < right && nums[mid] > nums[mid + 1]) return mid;
if (mid > left && nums[mid] < nums[mid - 1]) return mid - 1;
if (nums[mid] < nums[left]) right = mid - 1;
else left = mid + 1;
}
return -1;
}
//普通的二分查找
int binarySearch(vector<int>& nums, int start, int end, int target) {
int left = start, right = end;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) return mid;
else if (nums[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
};
本文介绍了一种在旋转数组中查找特定元素的高效算法。首先使用二分查找找到旋转分界点,将数组分为两个有序部分,然后在相应有序部分再次使用二分查找定位目标元素。文章详细解释了算法步骤,并提供了具体的实现代码。
821

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



