假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
你可以假设数组中不存在重复元素。
示例 1:
输入: [3,4,5,1,2]
输出: 1
示例 2:
输入: [4,5,6,7,0,1,2]
输出: 0
思路一:暴力法,遍历寻找最小值,稍微优化一下,当nums[i]<nums[i-1]&&nums[i]>nums[i+1]时,即为所寻
思路二:二分法,但是这里二分法需要改动,普通二分法适用于有序序列,这里并不是完全有序,当寻找是否为最小时和左右比较,当判断最小在左边还是右边时,和首尾比较。
class Solution
{
public:
int findMin(vector<int> &nums)
{
int n = nums.size();
int start = 0;
int end = n - 1;
int mid;
while (start < end)
{
mid = (start + end) / 2;
//特殊情况
if (mid == start)
{
return nums[start] < nums[end] ? nums[start] : nums[end];
}
//找到最小值
else if (nums[mid] < nums[mid - 1] && nums[mid] < nums[mid + 1])
{
return nums[mid];
}
//判断当前是否在左边
else if (nums[mid] > nums[0] && nums[mid] > nums[n - 1])
{
start = mid;
}
//判断当前是否在右边
else if (nums[mid] < nums[0] && nums[mid] < nums[n - 1])
{
end = mid;
}
//若没有旋转
else if (nums[mid] > nums[0] && nums[mid] < nums[n - 1])
{
return nums[0];
}
}
//为了通过编译
return nums[0];
}
};