题意
一个有序数组,现在从中间一个位置,将这个位置的前后两半交换。并且不知道是从哪个位置交换的。问这个数组的最小值。
思路
我们交换两截后,这个数组变成了这个样子:
然后我们去二分一下中间位置:
这时候,我们可以观察得到:如果
- a[m]<a[r] :右边数组一定是升序的, 并且结果不在[m + 1, r]中,应该在[l, r]中。
- a[m]>=a[r] :结果应该在[m + 1, r]中。
代码
class Solution {
public:
int findMin(vector<int>& a) {
int l = 0, r = a.size() - 1, m;
while (l < r) {
m = l + (r - l >> 1);
if (a[m] < a[r]) r = m;
else l = m + 1;
}
return a[r];
}
};