题目来源:https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/ 点击打开链接
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
Find the minimum element.
You may assume no duplicate exists in the array.
Subscribe to see which companies asked this question
首先我们需要知道, 对于一个区间A, 如果A[start] < A[stop], 那么该区间一定是有序的了。
假设在一个轮转的排序数组A, 我们首先获取中间元素的值, A[mid], mid = (start + stop) / 2。 因为数组没
有重复元素, 那么就有两种情况:
A[mid] > A[start], 那么最小值一定在右半区间, 譬如[4,5,6,7,0,1,2], 中间元素为7, 7 > 4, 最小元素
一定在[7,0,1,2]这边, 于是我们继续在这个区间查找。
A[mid] < A[start], 那么最小值一定在左半区间, 譬如[7,0,1,2,4,5,6], 这件元素为2, 2 < 7, 我们继续
在[7,0,1,2]这个区间查找。
class Solution153
{
public:
int findMin(vector<int> & nums){
int size = nums.size();
//cout << size<<endl;
if (size == 0)
return 0;
else if (size == 1)
return nums[0];
else if (size == 2)
return min(nums[0], nums[1]);
int left = 0;
int right = size - 1;
//cout << size << endl;
while (left < right-1){ //注意细节 -1
if (nums[left] < nums[right]){
return nums[left];
}
int mid = (left + right) / 2;
if (nums[mid] > nums[left]){
left = mid + 1;
}
else if (nums[mid] < nums[left]){
right = mid; //注意不是 mid-1
}
}
return min(nums[left], nums[right]);
}
};
int main(){
Solution153 solution;
{
vector<int> vec = { 2,1 };
//solution.findMin(vec);
cout << solution.findMin(vec) << endl;
}
system("pause");
return 0;
}