JZ4_旋转数组的最小数字
知识点:二分法
题目链接
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
示例1
[3,4,5,1,2]
输出
1
解题思路
1. 看到非递减排序的数组,就知道需要用到二分查找
2. 我们通过例子就可以解决
4 5 6 7 8 1 2 3
l m r a[r] < a[m] l = m+1
l m r a[m] < a[r] r = m
l,m r a[m] < a[r] r = m
l,m,r
2 5 5
l m r a[m] == a[r] r--;
l,m r a[m] < a[r] r = m
l,m,r
代码
#include "cheader.h"
class Solution {
public:
int minArray(vector<int>& numbers) {
int left = 0, right = numbers.size()-1;
while(left <= right){
int mid = left + (right-left)/2;
if(numbers[mid] > numbers[right])
left = mid+1;
else if(numbers[mid] < numbers[right])
right = mid;
else
right--;
}
return numbers[left];
}
};
int main()
{
vector<int> rotateArray{3,4,5,1,2};
Solution s;
cout<<s.minArray(rotateArray)<<endl;
return 0;
}
今天也是爱zz的一天