https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array/ 点击打开链接
不含有重复元素的有序数组,做一次循环右移后,找到最小值。
时间复杂度O(n)。算法思想: 二分搜索。
数组可以分成两部分:
1. 上半部分 :单调递增
2. 下半部分 : 单调递增,值都比上半部分小。
a[mid] 通过和 a[start]比较就能够确定a[mid]所处的位置而选择
不同的处理方法:
1. 处于上半部分:
find_min(a, mid + 1, end);2. 处于下半部分:
find_min(a, start, mid);当数组中存在重复元素的时候就不能够如此进行判断了。
比如 [3, 3, 2, 3] .
int find_min(vector<int> &a, int start, int end)
{
if (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 /* mid in bottom half */
{
return find_min(a, start, mid);
}
}