https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/
含有重复元素的有序数组,做一次循环右移后,找到最小值。
时间复杂度O(n)。算法思想: 二分搜索。
基本思想不变,只是因为重复元素的存在导致对于a[mid] 的判断
更加复杂了。除了下面两种明确的方式之外还有其他的情况需要进行考虑。
1. a[mid] < a[start] find_min(a, mid + 1, end);
2. a[mid] < a[end] find_min(a, start, mid);
3. a[mid] >= a[start] || a[mid] >= a[end]
find_min(a, start + 1, end);
将mid向下半部分移动,最小值存在于下半部分。
int find_min(vector<int> &a, int start, int end)
{
if (start == end || a[start] < a[end]) /* the array sorted, end search */
{
return a[start];
}
int mid = (start + end) / 2;
if (a[mid] > a[start]) /* mid in top half */
{
return find_min(a, mid + 1, end);
}
else if (a[mid] < a[end])/* mid in bottom half */
{
return find_min(a, start, mid);
}
else
{
return find_min(a, start + 1, end);
}
}