一、题目描述
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.
题目解读:一个有序数组可能沿着某个支点进行了旋转,找出旋转后的数组的最小值
思路一:用sort直接对数组进行排序,输出第一个值
c++代码1(6ms,2.26%)
class Solution {
public:
int findMin(vector<int>& nums) {
sort(nums.begin(),nums.end());
return nums[0];
}
};
思路二:用二分法,len表示数组的长度,初始化令left=0, right=len-1
(1)如果nums[left] < nums[right],说明旋转前后的数组没变,输出nums[left]即可
(2)否则,说明旋转后的数组发生了变化,mid=left+(right-left)/2,取中间的值跟nums[right]进行比较,如果nums[mid] > nums[right],说明最小值在右半部,令left=mid+1;否则,说明最小值在左边(并且可能就是nums[mid]),令right=mid。然后再循环进行比较,直到满足条件(1)。
c++代码2(3ms,30.59%)
class Solution {
public:
int findMin(vector<int>& nums) {
int len=nums.size();
int left=0;
int right=len-1;
int mid;
while(nums[left]>nums[right]){
mid=left+(right-left)/2;
if(nums[mid]>nums[right]){
left=mid+1;
}else{
right=mid;
}
}//while
return nums[left];
}
};