leetcode852题
//二分查找找到峰顶
int peakIndexInMountainArray(vector<int>& arr) {
int n = arr.size();
int left = 1;
int right = n - 2;
while (left < right) {
int mid = (left + right) / 2;
//如果左边小于右边说明峰顶在右边
if (arr[mid] < arr[mid + 1]) {
left = mid;
}
else {
//否则就在左边或者中间
right = mid - 1;
}
}
return left;
}
leetcode153题
//找到旋转数组最小值
int findMin(vector<int>& nums) {
if (nums.empty()) {
return -1;
}
int left = 0, right = nums.size() - 1;
while (left < right) {
int mid = left + (right - left) / 2;
//如果中间数字小于右边说明最小值在左半部分
if (nums[mid] < nums[right]) {
right = mid;
}
//如果中间数字大于右边说明最小值在右半部分
else if (nums[mid] > nums[right]) {
left = mid + 1;
}
//如果中间数字等于最右边的数字,无法判断最小数字
else {
right--;//将指针向左移动一位,继续搜索
}
}
return left;//当左右指针相遇,找到最小值下标
}
总结
二分查找是一种高效的查找算法,可以用于在有序数组中查找目标元素,也可以用于在旋转数组中查找最小值或峰顶。通过不断缩小搜索范围,每次将搜索范围缩小一半,可以快速地找到目标元素或最小值/峰顶。需要注意边界条件的处理,以及判断条件的选择。