题目
Suppose an array sorted in ascending order 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.
翻译
假设,一个数组,按照升序排列,然后被该数组可能经过k步的旋转。
找出其中最小的元素。可以假设,数组中不存在两个相同的数
思路
思路1,暴力法,遍历一遍。
思路2,采用二分法。
首先定义两个游标,index1,index2。
- 1.如果num[index1] > num[index2]则说明,存在断点。即4,5,6,0,1,2,3。即0处为断点也就是最小的值。
- 2,如果num[index1] < num[index2]则说明,最小值就是num[index1]。
- 3,对第一种情况在进行分析,假设【4,5,6,0,1,2,3】。我们把4,5,6当做第一组,0,1,2,3作为第二组,则mid = (index1+index2)/2;
- 1,如果num[mid] > num[index1] 则说明,mid在第一组中。则最小值,必然在mid之后,即start = mid+1;如果num[mid] < num[index1]则说明,mid在第二组中。则说明最小值在mid之前。即end = mid-1.
- 2,如果num[mid] > num[index2],则mid在第一组中,即最小值在mid之后。start = mid+1;如果num[mid] < num[index2],则说明mid在第二组中,即最小值在mid之前。end = mid-1;
代码
class Solution {
public:
int findMin(vector<int>& nums) {
int index1 = 0;
int index2 = nums.size()-1;
int indexMid = index1;
while(nums[index1] >= nums[index2]){
if(index2 - index1 == 1 || index1 == index2){
indexMid = index2;
break;
}
indexMid = (index1+index2)/2;
//mid在第一个序列中
if(nums[indexMid] >= nums[index1]){
index1 = indexMid;
//mid在第二个序列中
}else if(nums[indexMid] <= nums[index2]){
index2 = indexMid;
}
}
return nums[indexMid];
}
};