[11]旋转数组的最小数字
1.题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素:
例如,数组 { 3 , 4 , 5 , 1 , 2 } \{3,4,5,1,2\} {3,4,5,1,2}为 { 1 , 2 , 3 , 4 , 5 } \{1,2,3,4,5\} {1,2,3,4,5}的一个旋转,该数组的最小值为 1
2.分析
- 旋转数组
- 分成为两个排列的子数组
- 前面的元素 >= 后面的元素【不考虑特殊情况】
- 最小的元素是这两个子数组的分界线【二分】
3.思路视频
- 从头到尾遍历数组一次
- 二分【具体】
思路视频
二分找最小
大致有三种情况
- 最左边为最小值
- 3 进行二分查找【对于第二种,需要将其处理为单调】
4.代码
class Solution {
public:
int findMin(vector<int>& nums) {
int n = nums.size()-1;
if(n<0) return -1;
while(n>0 && nums[0]==nums[n]) n--; //去掉后部分的重复点
if(nums[0]<=nums[n]) return nums[0]; // 说明没有后面部分,为递增序列
int left=0, right=n; // 二分法找最小值
while(left<right)
{
int mid = right + left >> 1;
if(nums[0]>nums[mid])
right = mid;
else
left = mid+1;
}
return nums[right];
}
};