二分查找:
最小的数左边是大于,右边是大于等于
当判断 numbers[mid] < numbers[high] 时 high 要等于 mid,因为符合右边大于等于最小数,mid 可能是最小数
当判断 numbers[mid] > numbers[high] 时 low 要等于 mid + 1,因为high是大于等于最小数的,mid 比 high 大,一定比最小数大,所有 mid 的位置不可能是最小数的位置
当判断 numbers[mid] == numbers[high] 时,因为 low < high 还符合条件,循环退出时 low == high,此时low和high指向最小值,说明high是与最小数相同的值,此时 high 需要减一(这种情况是为了避免数组全是相等值)
class Solution {
public:
int minArray(vector<int>& numbers) {
int low = 0, high = numbers.size() - 1;
while (low < high) {
int mid = (low + high) >> 1;
if (numbers[mid] < numbers[high]) {
high = mid;
}
else if (numbers[mid] > numbers[high]) {
low = mid + 1;
}
else {
high -= 1;
}
}
return numbers[high];
}
};
本文介绍了一种使用二分查找法找到旋转排序数组中最小元素的算法实现。通过比较中间元素与最高索引元素的关系来调整搜索范围,最终确定最小元素的位置。特别地,对于数组中存在重复元素的情况也给出了相应的解决方案。
2647

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



